GIT学习笔记

作者: 嗷大彬彬 | 来源:发表于2018-07-05 16:13 被阅读4次

    初始设置

    git config --global user.name "lanbin"
    git config --global user.email "imlanbin@163.com"
    

    创建仓库

    git init
    

    创建完毕目录会多了个.git的隐藏文件夹

    版本回退

    • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
    • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
    • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

    本地仓库

    image
    1. git add把文件添加进去,实际上就是把文件修改添加到暂存区;

    2. git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

    3. git status查看状态

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

    5. git checkout -- readme.txt可以丢弃工作区的修改

    6. git reset HEAD <file> 可以把暂存区的修改撤销掉(unstage),重新放回工作区

    7. git rm test.txt删掉文件,并且git commit

    8. 在文件系统上误操作删除了文件,可以用git checkout -- test.txt还原

    image image

    GIT把内容按元数据方式存储,而SVN是按文件方式存储,git管理的是修改而不是文件;

    SVN在Commit前,我们都建议是先Update一下,跟本地的代码编译没问题,并确保开发的功能正常后再提交,这样其实挺麻烦的,有好几次同事没有先Updata,就Commit了,发生了一些错误,耽误了大家时间,Git可能这种情况会少些。

    远程仓库

    先有本地库,后有远程库的时候,如何关联远程库

    1. 首先登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库

    2. 添加到远程仓库

    git remote add origin git@github.com:lanbin/learngit.git
    

    远程库的名字就是origin

    1. 推送到远程仓库
    git push -u origin master
    

    先创建远程库,然后,从远程库克隆

    1. 从远程仓库克隆
    $ git clone git@github.com:lanbin/learngit.git
    Cloning into 'gitskills'...
    remote: Counting objects: 3, done.
    remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
    Receiving objects: 100% (3/3), done.
    

    Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

    分支管理

    HEAD指向的就是当前分支

    1. git checkout命令加上-b参数表示创建并切换
    $ git checkout -b dev
    Switched to a new branch 'dev'
    
    1. 用git branch命令查看当前分支
    $ git branch
    * dev
      maste
    
    1. 切换回master分支
    $ git checkout master
    Switched to branch 'master'
    
    1. 把dev分支的工作成果合并到master分支上
    $ git merge dev
    Updating d46f35e..b17d20e
    Fast-forward
     readme.txt | 1 +
     1 file changed, 1 insertion(+)
    
    1. 合并完成后,就可以放心地删除dev分支了
    $ git branch -d dev
    Deleted branch dev (was b17d20e
    

    Git鼓励大量使用分支:

    1. 查看分支:git branch
    2. 创建分支:git branch <name>
    3. 切换分支:git checkout <name>
    4. 创建+切换分支:git checkout -b <name>
    5. 合并某分支到当前分支:git merge <name>
    6. 删除分支:git branch -d <name>

    冲突管理

    1. 如果存在冲突,将合并失败并有提示
      $ git merge feature1
      Auto-merging readme.txt
      CONFLICT (content): Merge conflict in readme.txt
      Automatic merge failed; fix conflicts and then commit the result.

    2. git status也可以告诉我们冲突的文件

    $ git status
    On branch master
    Your branch is ahead of 'origin/master' by 2 commits.
      (use "git push" to publish your local commits)
    
    You have unmerged paths.
      (fix conflicts and run "git commit")
      (use "git merge --abort" to abort the merge)
    
    Unmerged paths:
      (use "git add <file>..." to mark resolution)
    
        both modified:   readme.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    

    可以直接查看readme.txt的内容

    Git is a distributed version control system.
    Git is free software distributed under the GPL.
    Git has a mutable index called stage.
    Git tracks changes of files.
    <<<<<<< HEAD
    Creating a new branch is quick & simple.
    =======
    Creating a new branch is quick AND simple.
    >>>>>>> feature1
    
    1. 修改后再提交,然后用带参数的git log也可以看到分支的合并情况
    $ git log --graph --pretty=oneline --abbrev-commit
    *   cf810e4 (HEAD -> master) conflict fixed
    |\  
    | * 14096d0 (feature1) AND simple
    * | 5dc6824 & simple
    |/  
    * b17d20e branch test
    * d46f35e (origin/master) remove test.txt
    * b84166e add test.txt
    * 519219b git tracks changes
    * e43a48b understand how stage works
    * 1094adb append GPL
    * e475afc add distributed
    * eaadf4e wrote a readme file
    
    1. git log --graph命令可以看到分支合并图。
    2. 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成
    3. 解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

    分支管理策略

    1. master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
    2. dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
    3. 开发者都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

    所以,团队合作的分支看起来就像这样:

    image

    BUG分支

    修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
    当手头工作没有完成时,先把工作现场git stash,然后去修复bug,修复后,再git stash pop,回到工作现场。

    1. git stash命令把工作现场“储藏”起来
    $ git stash
    Saved working directory and index state WIP on dev: f52c633 add merge
    
    1. git stash list命令看看储存清单
    $ git stash list
    stash@{0}: WIP on dev: f52c633 add merge
    
    1. 用git stash apply从储存恢复到工作现场,恢复后stash内容并不删除

    2. 用git stash drop命令来删除储存

    3. git stash pop = git stash apply + git stash drop

    feature分支

    1. 开发一个新实验功能,最好新建一个分支;
    2. 如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除;

    推送分支

    1. 查看远程库信息,使用git remote -v;

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

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

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

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

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

    哪些分支需要推送,哪些不需要呢?

    1. master分支是主分支,因此要时刻与远程同步;
    2. dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
    3. bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
    4. feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

    合并分支

    image image image

    在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用"git-add"命令去更新这些内容的索引(index), 然后,你无需执行 git-commit,只要执行:

    $ git rebase --continue
    

    这样git会继续应用(apply)余下的补丁。

    在任何时候,你可以用--abort参数来终止rebase的行动,并且"mywork" 分支会回到rebase开始前的状态

    $ git rebase --abort
    

    标签管理

    1. 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
    2. 命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
    3. 命令git tag可以查看所有标签。
    4. 命令git show <tagname>查看标签信息
    5. 命令git push origin <tagname>可以推送一个本地标签;
    6. 命令git push origin --tags可以推送全部未推送过的本地标签;
    7. 命令git tag -d <tagname>可以删除一个本地标签;
    8. 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

    使用github

    1. 在GitHub上,可以任意Fork开源仓库
      eg. https://github.com/twbs/bootstrap
    2. 自己拥有Fork后的仓库的读写权限;
      点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后从自己的账号下clone
    git clone git@github.com:lanbin/bootstrap.git
    
    
    1. 可以推送pull request给官方仓库来贡献代码。
      对方是否接受你的pull request就不一定了

    使用码云gitee

    廖雪峰Git教程-使用码云

    自定义Git

    忽略特殊文件

    1. 忽略某些文件时,需要编写.gitignore;
    2. .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理

    参考文献

    1. 廖雪峰Git教程
    2. Git Community Book 中文版

    相关文章

      网友评论

        本文标题:GIT学习笔记

        本文链接:https://www.haomeiwen.com/subject/ommpuftx.html