Featured image of post Git进阶之冲突处理、忽略文件

Git进阶之冲突处理、忽略文件

1778 words

解决冲突

冲突的产生

内容冲突

Git内容冲突产生的原因是,针对版本库中某个文件的某项内容,不同的操作对其做了不同的修改,以致于在合并不同的操作时发生矛盾。比如下面的例子:

1.我们在本地master分支,添加了文件hello,其内容如下:

1
Learning English is easy and simple

2.然后,我们由master分支切换到一个新的分支develop,并修改hello文件内容如下:

1
Learning English is easy & simple

3.随后将其提交到了本地develop分支。 我们又切换回master分支,并再次对hello内容进行了修改:

1
Learning English is easy or simple

这样,当我们将develop分支合并到master分支的时候,就会出现冲突提示如下:

1
2
3
Auto-merging hello
CONFLICT (content): Merge conflict in hello
Automatic merge failed; fix conflicts and then commit the result.

冲突出现的原因是,我们在develop分支和master分支上,都对hello文件的内容做了修改,这样当将develop合并到master时,Git就不确定究竟应该采用哪个修改。

树冲突

方法文件名修改造成的冲突,称为树冲突。比如,A用户把文件C改名为A,B用户把文件C改名为B,那么B合并这两个提交时,就会出现冲突:

1
2
CONFLICT (rename/rename): Rename "C"->"B" in branch "HEAD" rename
Automatic merge failed; fix conflicts and then commit the result.

此时如果使用git status查看版本库的状态,会得到如下提示信息:

1
2
3
4
5
6
7
8
9
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)
Unmerged paths:
  (use "git add/rm <file>..." as appropriate to mark resolution)
        added by them:   A
        added by us:     B
        both deleted:    C
no changes added to commit (use "git add" and/or "git commit -a")

树冲突产生的原因是,我们将同一文件名,在不同操作中,修改为不同的名字。

解决冲突

内容冲突

当产生内容冲突时,如果你打开冲突发生的文件,你会在冲突区域发现类似于下面的内容:

1
2
3
4
5
<<<<<<<HEAD
Learning English is easy or simple
=======
Learning English is easy & simple
>>>>>>> develop

这个就是我们上面所举的内容冲突的例子,冲突文件的内容。从中可以看到«««< HEAD与=======包括的是我们当前分支的内容,而=======和»»»> develop之间的则是需要合并过来的内容,为了解决冲突我们可以手动解决这些冲突,也可以使用图形化工具帮助解决。如果以手动方式解决,我们可以编辑冲突区域内容为我们想要的内容,比如将其修改成如下内容:

1
Learning English is easy and simple

然后再执行git add和git commit操作提交,这样就能将冲突解决了。 即解决冲突的一般过程为:

1.手动编辑冲突区域;

2.执行git add,将编辑提交到暂存区;

3.执行git commit,将编辑提交到本地仓库以解决冲突。

树冲突

解决树冲突时,对于上面示例中的树冲突,如果最终决定采用文件B,我们可以采用如下方式解决:

1
2
3
4
git rm A
git rm C
git add B
git commit

即从本地仓库中删除A和C文件,然后再添加B文件并最终提交。

强制操作

强制操作的分类

使用最频繁的强制操作,主要在以下几个方面:

  • 强制推送 如果远程的某个分支的内容需要被覆盖,这个时候就需要你进行强制推送,使用本地内容去覆盖该分支。
  • 强制合并 如果本地分支的内容需要被远程内容覆盖,这个时候就需要强制合并远程分支内容到本地。
  • 强制删除 如果你需要强制删除版本库、暂存区或者工作区的内容时,就需要强制删除。比如我们之前介绍的checkout,就可以使用-f参数,强制丢弃本地修改。

强制操作方法

  • 强制推送 强制推送和普通推送的区别,就在于在末尾加上了-f参数,即:
1
git push 远程主机名 本地分支名:远程分支名 -f

具体使用方法如下:

1
2
#将本地分支强制推送到远程主机origin的master分支
git push origin master:master -f

强制合并 强制合并和普通合并的区别,也是其在末尾加上了-f参数,即: git pull 远程主机名 远程分支名:本地分支名 -f 具体使用方法示例如下:

1
2
#将远程master分支强制合并到本地master分支
git pull origin master:master -f

忽略文件

如何忽略文件

在Git工作区的根目录下,创建一个特殊的.gitignore文件,把要忽略的文件名或者文件名的通配符填进去,然后将.gitignore提交到本地仓库,这样Git就会在你添加或者提交时,自动忽略这些文件。

自定义忽略文件

如果我们需要自己定义忽略哪些文件,就需要将其添加到.gitignore文件中去。你可以使用文件的全称,或者使用正则匹配的通配符。如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 忽略指定文件
HelloWrold.class
# 忽略指定文件夹
bin/
bin/gen/
# 忽略.class的所有文件
*.class
# 忽略名称中末尾为ignore的文件夹
*ignore/
# 忽略名称中间包含ignore的文件夹
*ignore*/
使用 Hugo 构建
主题 StackJimmy 设计