zoukankan      html  css  js  c++  java
  • git

    ---恢复内容开始---

    1、安装 

    https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137396287703354d8c6c01c904c7d9ff056ae23da865a000 

    2、修改设置仓库用户及邮箱

    新增 : 

    $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com"
     查看:
    $ git config user.name
    $ git config user.email
    修改:
    $ git config --global user.name "username"  
    $ git config --global user.email "email"
    3、创建、查看目录
    $ mkdir learngit 
    $ cd learngit 
    $ pwd /Users/michael/learngit
    4、把这个目录变成Git可以管理的仓库,也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的
    $ git init
    ls -ah  (查看隐藏的.git 目录,判断是否是git 仓库)
    5、把文件添加到仓库
    $ git add readme.txt
    6、用命令git commit告诉Git,把文件提交到仓库
    $ git commit -m "wrote a readme file"
    commit可以一次提交很多文件,所以你可以多次add不同的文件
    7、查看git 状态  git status
    $ git status 
    # On branch master 
    # Changes not staged for commit: (未add)
    #   (use "git add <file>..." to update what will be committed) 
    #   (use "git checkout -- <file>..." to discard changes in working directory) 
    # #    modified:   readme.txt 
    # no changes added to commit (use "git add" and/or "git commit -a")
    8、查看修改部分 
    $ git diff readme.txt
    diff --git a/readme.txt b/readme.txt index 46d49bf..9247db6 100644 
    --- a/readme.txt 
    +++ b/readme.txt 
    @@ -1,2 +1,2 @@ 
    -Git is a version control system.   (修改前)
    +Git is a distributed version control system.  (修改后)
    Git is free software  (没有做任何修改)
    $ git status 
    # On branch master 
    # Changes to be committed: (add 之后的准备提交)
    #   (use "git reset HEAD <file>..." to unstage) 
    # #       modified:   readme.txt # 
    8、git log (--pretty=oneline 简短版
    9、版本回退   使用 git reset 命令
    $ git reset --hard HEAD^ 
    HEAD is now at ea34578 add distributed

    HEAD表示当前版本
    上一个版本就是HEAD^
    上上一个版本就是HEAD^^
    往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

    往下:

    办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPLcommit id3628164...,于是就可以指定回到未来的某个版本:

    $ git reset --hard 3628164
    HEAD is now at 3628164 append GPL
    

    版本号没必要写全,前几位就可以了,Git会自动去找。

     

    Git提供了一个命令git reflog用来记录你的每一次命令:

    $ git reflog 
    ea34578 HEAD@{0}: reset: moving to HEAD^ 
    3628164 HEAD@{1}: commit: append GPL 
    ea34578 HEAD@{2}: commit: add distributed 
    cb926e7 HEAD@{3}: commit (initial): wrote a readme file 
    10、暂存区的概念

    先对readme.txt做个修改,比如加上一行内容:


    Git is a distributed version control system. 
    Git is free software distributed under the GPL. 
    Git has a mutable index called stage. 

    然后,在工作区新增一个LICENSE文本文件(内容随便写)。

    先用git status查看一下状态:

    $ git status 
    # On branch master 
    # Changes not staged for commit: 
    #   (use "git add <file>..." to update what will be committed) 
    #   (use "git checkout -- <file>..." to discard changes in working directory) 
    # #       modified:   readme.txt 
    # # Untracked files: 
    #   (use "git add <file>..." to include in what will be committed) # 
    #       LICENSE no changes added to commit (use "git add" and/or "git commit -a") 

    Git非常清楚地告诉我们,readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked

    现在,使用两次命令git add,把readme.txtLICENSE都添加后,用git status再查看一下:

    $ git status 
    # On branch master 
    # Changes to be committed: 
    #   (use "git reset HEAD <file>..." to unstage) 
    # #       new file:   LICENSE 
    #       modified:   readme.txt # 

     11、git 特点 

    Git跟踪并管理的是修改,而非文件。 

     Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。

     git diff HEAD -- readme.txt   命令可以查看工作区和版本库里面最新版本的区别

     12、git checkout -- file可以丢弃工作区的修改

    命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

    一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

    一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

    总之,就是让这个文件回到最近一次git commitgit add时的状态。

     13、用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区:

    $ git reset HEAD readme.txt

     14、删除文件

    在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交:

    $ git add test.txt
    $ git commit -m "add test.txt"
    [master 94cdc44] add test.txt
     1 file changed, 1 insertion(+)
     create mode 100644 test.txt
    

    一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

    $ rm test.txt
    

    这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:

    $ git status
    # On branch master
    # Changes not staged for commit:
    #   (use "git add/rm <file>..." to update what will be committed)
    #   (use "git checkout -- <file>..." to discard changes in working directory)
    #
    #       deleted:    test.txt
    #
    no changes added to commit (use "git add" and/or "git commit -a")
    

    现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

    $ git rm test.txt
    rm 'test.txt'
    $ git commit -m "remove test.txt"
    [master d17efd8] remove test.txt
     1 file changed, 1 deletion(-)
     delete mode 100644 test.txt
    

    现在,文件就从版本库中被删除了。

    另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

    $ git checkout -- test.txt
    

    git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

    小结

    命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

    第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

    $ ssh-keygen -t rsa -C "youremail@example.com" 

    你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

    如果一切顺利的话,可以在用户主目录(window 在用户/yulb下,linux 在~/ssh 下 ls -a 查看所有 包含隐藏文件)里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

     15、本地添加 .ssh id_rsaid_rsa.pub

      id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人

     16、远程github 

    登陆GitHub,打开“Account settings”,“SSH Keys”页面:

    然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

    17、创建一个新仓库

    在右上角找到“Create a new repo”按钮,创建一个新的仓库: 

     18、本地和远程仓库关联

    我们根据GitHub的提示,在本地的learngit仓库下运行命令:

    $ git remote add origin git@github.com:username/learngit.git
    要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

     远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

    从现在起,只要本地作了提交,就可以通过命令:

    $ git push origin master 

    把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

     19、从远程仓库克隆到本地

    现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库:

    $ git clone git@github.com:michaelliao/gitskills.git

     使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

     20、创建分支

    Git鼓励大量使用分支:

    查看分支:git branch

    创建分支:git branch <name>

    切换分支:git checkout <name>

    创建+切换分支:git checkout -b <name>

    合并某分支到当前分支:git merge <name>

    删除分支:git branch -d <name>

    下面开始实战。

    首先,我们创建dev分支,然后切换到dev分支:

    $ git checkout -b dev Switched to a new branch 'dev' 

    git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

    $ git branch dev $ git checkout dev Switched to branch 'dev' 

    然后,用git branch命令查看当前分支:

    $ git branch * dev   master 

    git branch命令会列出所有分支,当前分支前面会标一个*号。

    然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

    Creating a new branch is quick. 

    然后提交:

    $ git add readme.txt  $ git commit -m "branch test" [dev fec145a] branch test  1 file changed, 1 insertion(+) 

    现在,dev分支的工作完成,我们就可以切换回master分支:

    $ git checkout master Switched to branch 'master' 

    切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

    git-br-on-master

    现在,我们把dev分支的工作成果合并到master分支上:

    $ git merge dev Updating d17efd8..fec145a Fast-forward  readme.txt |    1 +  1 file changed, 1 insertion(+) 

    git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

    注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

    当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

    合并完成后,就可以放心地删除dev分支了:

    $ git branch -d dev Deleted branch dev (was fec145a). 

    删除后,查看branch,就只剩下master分支了:

    $ git branch * master 

    因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

     21、解决分支

    merge失败,有conflicts没解决,可以:

    1、解决conflicts后再次执行merge;

    2、回退到merge前

     git reset --merge

     git log --graph命令可以看到分支合并图。

     22、取消快速 模式

    准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward

    $ git merge --no-ff -m "merge with no-ff" dev 
    Merge made by the 'recursive' strategy.  
    readme.txt |    1 +  
    1 file changed, 1 insertion(+) 

     加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

     23、bug 分支

    Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

    $ git stash 
    Saved working directory and index state WIP on dev: 6224937 add merge HEAD is now at 6224937 add merge 

    现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

    git stash list命令看看:

    $ git stash list 
    stash@{0}: WIP on dev: 6224937 add merge 

    但是需要恢复一下,有两个办法:

    一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

    另一种方式是用git stash pop,恢复的同时把stash内容也删了:

    你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:

    $ git stash apply stash@{0} 

     Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用命令git branch -D feature-vulcan

     24、多人写作

    git remote -v显示更详细的信息 
    $ git remote -v
    origin  git@github.com:michaelliao/learngit.git (fetch)
    origin  git@github.com:michaelliao/learngit.git (push)

     推送分支

    $ git push origin master
    • 查看远程库信息,使用git remote -v

    • 本地新建的分支如果不推送到远程,对其他人就是不可见的;

    • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

    • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

    • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

    • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

    25 、标签管理

     tag就是一个让人容易记住的有意义的名字 如 版本号是v1.2

     敲命令git tag <name>就可以打一个新标签

     可以用命令git tag查看所有标签

     忘了打标签,怎么办?

    $ git log --pretty=oneline --abbrev-commit
    6a5819e merged bug fix 101
    cc17032 fix bug 101
    7825a50 merge with no-ff
    6224937 add merge
    59bc1cb conflict fixed
    400b400 & simple
    75a857c AND simple
    fec145a branch test
    d17efd8 remove test.txt
    ... 

    比方说要对add merge这次提交打标签,它对应的commit id是6224937,敲入命令:

    $ git tag v0.9 6224937

     git show <tagname>查看标签信息

    还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

    $ git tag -a v0.1 -m "version 0.1 released" 3628164 

    用命令git show <tagname>可以看到说明文字:

    还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

    $ git tag -a v0.1 -m "version 0.1 released" 3628164 

    用命令git show <tagname>可以看到说明文字:

    $ git show v0.1 
    tag v0.1 Tagger: Michael Liao <askxuefeng@gmail.com> Date:   Mon Aug 26 07:28:11 2013 +0800  version 0.1 released  commit 3628164fb26d48395383f8f31179f24e0882e1e0 Author: Michael Liao <askxuefeng@gmail.com> Date:   Tue Aug 20 15:11:49 2013 +0800      append GPL

     26、操作标签

     删除标签

    $ git tag -d v0.1
    Deleted tag 'v0.1' (was e078af9)

    如果要推送某个标签到远程,使用命令git push origin <tagname>

    $ git push origin v1.0 
    Total 0 (delta 0), reused 0 (delta 0) To git@github.com:michaelliao/learngit.git  * [new tag]         
    v1.0 -> v1.0

    或者,一次性推送全部尚未推送到远程的本地标签:

    $ git push origin --tags

    如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

    $ git tag -d v0.9 Deleted tag 'v0.9' (was 6224937)

    然后,从远程删除。删除命令也是push,但是格式如下:

    $ git push origin :refs/tags/v0.9
  • 相关阅读:
    cocos3.2触摸事件接收顺序
    触摸点是否在按钮矩形内
    scrollview里container拖动显示问题
    cocos2dx 显示对象尺寸
    allocating an object of abstract class
    学习scorllview
    cocos2dx引用计数
    addchild 报错不能添加nil
    有用的宏
    一段SQL
  • 原文地址:https://www.cnblogs.com/tank-/p/8352619.html
Copyright © 2011-2022 走看看