git版本管理软件——git发布补丁和打补丁
某几个文件的代码修改后要发到同事开发的代码中,或者修复了bug后要将修复的代码添加到另外一份库中,这个时候手动记下改动太麻烦,git有创建补丁的功能,即将改动的代码统一添加到一个补丁文件中,后缀名为.patch,然后通过邮件或U盘的形式将补丁发送到需要的版本中,然后再执行打补丁命令,这样改动会自动合并到该版本库中。
git创建补丁git format-patch
git可以将修改过的差异打包成文件,以补丁的形式发布,补丁的后缀名为patch,创建的补丁保存在当前目录下。
1、通过git diff创建补丁
命令:git diff > my.patch
该命令最直接的是将diff不同的地方将其打包成补丁,以my.patch的文件将diff的内容保存下来,文件的内容如下所示
diff --git a/reset.txt b/reset.txt
index 7389186..53cef72 100644
--- a/reset.txt
+++ b/reset.txt
@@ -1 +1,4 @@
add reset
+
+add git patch test
+
命令:git diff --no-prefix > my.patch
该命令与上一个命令不同的是,将对比文件前后的形象标志去掉了。
diff --git reset.txt reset.txt
index 7389186..53cef72 100644
--- reset.txt
+++ reset.txt
@@ -1 +1,4 @@
add reset
+
+add git patch test
+
命令:git diff master > patch
与上面的命令相同,即将master上的改动打包成补丁。
2、通过某个提交创建补丁
具体将某一次的commit提交的内容和以后提交的commit的内容分别以文件分开,将改动封装成补丁。
命令:git format-patch <commit id>
commit 99e826d211ddea11689d09e0362877c076522b13
Author: zx <zx@git.com>
Date: Sun Nov 6 20:54:33 2016 +0800
add test git patch
commit 1996afe5edeaab3f7269dcbe51f2d658936d7f8c
Merge: 546d73a 0f58788
Author: zx <zx@git.com>
Date: Sun Nov 6 20:12:38 2016 +0800
add readme
commit 546d73a5842ecd4df8dc35994bc520b22c12fcb3
Author: zx <zx@git.com>
Date: Sun Nov 6 09:26:29 2016 +0800
add reset.txt
ghost@ghost-machine:~/workspace/test/Project_test$ git format-patch 546d73a5842ecd4df8dc35994bc520b22c12fcb3
0001-add-readme.txt.patch
0002-add-test-git-patch.patch
ghost@ghost-machine:~/workspace/test/Project_test$ ls
0001-add-readme.txt.patch 0002-add-test-git-patch.patch readme.txt reset.txt
ghost@ghost-machine:~/workspace/test/Project_test$
3、最近的commit提交的补丁
命令:git format-patch HEAD^ <==最近的1次commit的patch
命令:git format-patch HEAD^^ <==最近的2次commit的patch
与上面得到的结果一样,这样做就不用输入commit的哈希值
最终的补丁的内容为
From 99e826d211ddea11689d09e0362877c076522b13 Mon Sep 17 00:00:00 2001
From: zx <zx@git.com>
Date: Sun, 6 Nov 2016 20:54:33 +0800
Subject: [PATCH] add test git patch
---
reset.txt | 3 +++
1 file changed, 3 insertions(+)
diff --git a/reset.txt b/reset.txt
index 7389186..53cef72 100644
--- a/reset.txt
+++ b/reset.txt
@@ -1 +1,4 @@
add reset
+
+add git patch test
+
--
2.7.4
git打补丁patch
将创建的补丁放在同一份镜像版本上,即开发过程中另外同事的开发版本上,输入打补丁命令:
命令:patch -p1 < my.patch
命令:patch -p0 < my.patch
p后面的数字0,1,2,是指略去的patch文件中的前几级目录,对于diff文件的内容来说
diff --git a/reset.txt b/reset.txt
index 7389186..53cef72 100644
-p0 就表示从当前目录,找一个叫作b的目录再在这个目录中找一个reset.txt的文件。
-p1 就表示从当前目录,忽略第一层b的目录,在当前目录中找一个reset.txt的文件。
当前目录可以用命令:pwd得到。
命令:patch -p1 < my.patch 效果显示为
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$ ls
my.patch readme.txt reset.txt
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$ patch -p1 < my.patch
patching file reset.txt
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: reset.txt
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
my.patch
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$
对于命令:git diff —no-prefix > my.patch所创建的补丁来说
diff --git reset.txt reset.txt
index 7389186..53cef72 100644
命令:patch -p0 < my.patch 效果显示为
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$ ls
my.patch readme.txt reset.txt
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$ patch -p0 < my.patch
patching file reset.txt
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: reset.txt
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
my.patch
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$
对于命令:git format-patch所创建的补丁,打补丁后不会将原来的commit的信息打上去,也就是打补丁后git log看不到commit的信息,而是以差异化的形式将补丁打上去,用git diff可以看到,打完补丁后还需要手动git add 和git commit提交自己的修改。
如果此时再打补丁,git会有明显的提示,提示该补丁已经打过,会询问下一步,如下所示,输入n是不变,输入y为还原该补丁的改动
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$ patch -p1 < my.patch
patching file patch.txt
Reversed (or previously applied) patch detected! Assume -R? [n]
效果如下所示
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$ patch -p1 < 0001-add-test-git-patch.patch
patching file reset.txt
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$ git log
commit 1996afe5edeaab3f7269dcbe51f2d658936d7f8c
Merge: 546d73a 0f58788
Author: zx <zx@git.com>
Date: Sun Nov 6 20:12:38 2016 +0800
add readme
commit 546d73a5842ecd4df8dc35994bc520b22c12fcb3
Author: zx <zx@git.com>
Date: Sun Nov 6 09:26:29 2016 +0800
add reset.txt
commit 70456a99ee3899c40d4846b7101646855b7a1219
Author: zx <zx@git.com>
Date: Tue Jun 14 22:55:17 2016 +0800
add 20160614.
commit 824005a2c174d195c5823b2a412ce2c3081c39f3
Author: zx <zx@git.com>
Date: Tue Jun 14 22:53:50 2016 +0800
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$ git diff
diff --git a/reset.txt b/reset.txt
index 7389186..53cef72 100644
--- a/reset.txt
+++ b/reset.txt
@@ -1 +1,4 @@
add reset
+
+add git patch test
+
ghost@ghost-machine:~/workspace/test/ghost_project/Project_test$
git撤销打补丁
撤销该补丁的修改效果回到打补丁前代码的状态
命令:patch -R -p1 < my.patch
撤销补丁还有种更方便的方法,将文件还原checkout,但这个是对文件整体的还原,该文件除补丁之外的修改也被还原了。
#打补丁或pull仓库造成的冲突解决
冲突是指打补丁或拉远程仓库的内容和工作版本修改的同一个地方不一致,补丁修改或远程仓库的改动的地方的原型与本地工作版本修改的地方不一致。
例如git pull时会有如下提示
来自 /home/ghost/warehouse/Project_test
155169b..d8b74f0 master -> origin/master
自动合并 patch.txt
冲突(内容):合并冲突于 patch.txt
自动合并失败,修正冲突然后提交修正的结果。
形成冲突的文本文件如下所示
patch diff test
<<<<<<< HEAD
patch diff is 2
=======
patch diff is 1
>>>>>>> d8b74f02ffdf6b2843fdce848490d40f6e562c95
<<<<<<< HEAD到=======,这个范围内的内容为本地文件的内容。
=======到>>>>>>> d8b74f02ffdf6b2843fdce848490d40f6e562c95,这个范围内的内容是哈希值d8b74f0xxx的commit提交所修改的内容,这两个地方修改的内容不一致,这就需要手动去修改。
手动修改,将代码保留最新的结果,手动删除冲突提示,修改的结果如下
patch diff test
patch diff is 2
修改后再git add 、git commit,添加注释说明解决冲突的原因。
如果是打补丁,打完补丁后记得要将补丁删除,以免将补丁加入到版本管理中。
打补丁或pull仓库造成的冲突解决
冲突是指打补丁或拉远程仓库的内容和工作版本修改的同一个地方不一致,补丁修改或远程仓库的改动的地方的原型与本地工作版本修改的地方不一致。
例如git pull时会有如下提示
来自 /home/ghost/warehouse/Project_test
155169b..d8b74f0 master -> origin/master
自动合并 patch.txt
冲突(内容):合并冲突于 patch.txt
自动合并失败,修正冲突然后提交修正的结果。
形成冲突的文本文件如下所示
patch diff test
<<<<<<< HEAD
patch diff is 2
=======
patch diff is 1
>>>>>>> d8b74f02ffdf6b2843fdce848490d40f6e562c95
**<<<<<<< HEAD到=======,这个范围内的内容为本地文件的内容。
**=======到>>>>>>> d8b74f02ffdf6b2843fdce848490d40f6e562c95,这个范围内的内容是哈希值d8b74f0xxx的commit提交所修改的内容,这两个地方修改的内容不一致,这就需要手动去修改。
手动修改,将代码保留最新的结果,手动删除冲突提示,修改的结果如下
patch diff test
patch diff is 2
修改后再git add 、git commit,添加注释说明解决冲突的原因。
如果是打补丁,打完补丁后记得要将补丁删除,以免将补丁加入到版本管理中。
还没有评论,来说两句吧...