首页 > 代码库 > Git 简洁教程之 高级操作

Git 简洁教程之 高级操作

git 合并冲突的解决

  • 在分支QA上面修改readme.txt文件,并进行提交
    技术分享技术分享
  • 在分支DEV上面修改readme.txt文件,并进行提交
    技术分享
  • 切换到Master分支,并把QA的修改合并过来,此时可以顺利的进行合并
    技术分享技术分享
  • 此时尝试在Master上合并DEV的内容时,会提交失败,并提示有冲突
    技术分享技术分享
  • 打开readme.txt文件,手动清楚差异
  • 对readme.txt执行add以及commit操作
  • 使用git log --graph --pretty=oneline --abbrev-commit 命令可以看到分支合并的情况
    技术分享
  • 分别切换到QA/DEV/MASTER三个分支,执行git push 命令将修改push到github上,下面以dev分支为例
    技术分享技术分享

禁用fast forward模式

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。在merge的时候通过命令:git merge --no-ff -m "merge with no-ff" dev


创建Bug分支

软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交,

并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?

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

流程大概如下

  1. 在正在开发的dev分支上执行git stash
    技术分享
  2. 切换到master分支,利用master分支创建issue-101分支技术分享
    技术分享
  3. 在issue-101上修复完后,切换到master分支,将issue-101分支的内容合并过来,并删除issue-101分支
  4. 切换到dev分支,执行git stash list 查询stash列表,利用git stash apply或是git stash pop恢复步骤1中的dev内容

    使用git stash apply恢复,恢复后,stash内容并不删除,你需要用git stash drop来删除,用git stash pop,恢复的同时把stash内容也删了

    技术分享技术分享

强行删除分支

当对一个分支进行修改的过程中,如果还有文件没有提交,此时想立刻终止该分支的修改,并删除该分支,此时若使用git branch -d 进行删除会提示有未提交的文件,不能删除,可以使用git branch -D 进行强制删除
技术分享

多人协作的开发流程

通过在一台电脑的两个目录来模拟多个开发者在远程dev分支的开发,下面的流程对任一开发者都适用

  1. 使用git clone创建本地仓库
  2. 使用git checkout -b dev origin/dev 创建远程dev分支的本地仓库
  3. 在本地的dev分支上进行修改并commit.
  4. 此时另外一位开发者已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送,此时会因为冲突报错
    技术分享技术分享
  5. 此时需要用git pull 命令把最新的更改抓取下来,并对文件进行合并
    技术分享
    技术分享

    如果git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置devorigin/dev的链接:

    $ git branch --set-upstream dev origin/dev
    合并后进行commit
    技术分享
  6. 此时可以将修改push到远程的dev上了
    技术分享技术分享
    此时github上的信息已经得到更新
    技术分享技术分享

标签的相关操作

  • git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id; 
  • git tag -a <tagname> -m "blablabla..."可以指定标签信息; 
  • git tag -s <tagname> -m "blablabla..."可以用PGP签名标签; 
  • git tag 可以查看所有标签
  • git show <tagname>用于查看tag的明细
  • 删除tag
    • git tag -d <tagname>删除一个本地的tag
    • 对于一个已经提交到远程仓库的tag,要删除的话需要先执行git tag -d v0.9 进行本地删除,然后在执行git push origin :refs/tags/v0.9 进行远程删除
      技术分享技术分享
  • 推送 tag到远程仓库
    • git push orgin v0.1 将一个tag推送到远程仓库
    • git push origin --tags 一次性推送全部尚未推送到远程的本地标签

忽略特殊文件


有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示“Untracked files ...”,有强迫症的童鞋心里肯定不爽。 
好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。 
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore 
忽略文件的原则是: 
  • 忽略操作系统自动生成的文件,比如缩略图等; 
  • 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件; 
  • 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
下面举个java的例子
  • 在目录下创建一个java文件,并执行javac,此时查看状态
    技术分享技术分享
  • 在该目录下创建一个.gitignore文件,并输入*.class,再次执行git status,发现class文件没有被跟踪了
    技术分享技术分享













Git 简洁教程之 高级操作