git cherry-pick 与git show + git apply 与git merge

Phanix
·
·
IPFS
·

如果是有部分的更改或新增功能,用git merge 有时候不见得是好主意

git merge的好处是可以直接把某branch commit 直接整合入另一branch,但如果conflict 超多,有时候反而resolve conflict 会搞到疯掉,特别是两个branch 已经分道扬镳很久。

另一个情况是,某个commit 的”一部分”修改,要套用在现在的branch 上,那merge 也是不太适用。这时候git cherry-pick 就很适合,特别是加上-n (ie –no-commit) 这个指令会把另个commit 的修改全部apply 过来,例如;

 $ git cherry-pick 951c5c77 -n
$ git status
On branch A
Your branch is up to date with 'origin/A'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

  modified: js/main.js
  modified: main.html

cherry-pick不需要的部分可以用git rest 配合git add来完成。

另一种方式是用git show 配合git apply,前者可以显示某个commit 做的变更,如果加上档案名称,就只列出该档案的变更。例如:

 $ git show 951c5c77 main.html
commit 951c5c77be28f0a8c3f21f406895aab187003473 (origin/A, A)
Author: P <p@test.com>
Date: Thu Mar 28 14:58:43 2019 +0800

    some commit message

diff --git a/main.html b/main.html
index 8f5c4ac..c4f97f3 100644
--- a/main.html
+++ b/main.html
@@ -84,11 +84,11 @@
                                <div class="carousel-inner" role="listbox">
                                        
                                </div>
- <a class="left carousel-control" href="#glasses-selection" role="button" data-slide="prev">
+ <a class="left carousel-control" href="#glasses-selection" role="button" data-slide="prev" id="preitems">
                                        <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
                                        <span class="sr-only">Previous</span>
                                </a>
- <a class="right carousel-control" href="#glasses-selection" role="button" data-slide="next">
+ <a class="right carousel-control" href="#glasses-selection" role="button" data-slide="next" id="nextitems">
                                        <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
                                        <span class="sr-only">Next</span>
                                </a>

列出不一样的部分,然后再git apply 就可以更新过去了。

 $ git show 951c5c77 main.html | git apply

不过用cherry-pick 或git show + git apply 都不会有类似git merge 的那种commit relation 被建立就是,可能得靠commit message 才能知道关联性。

Original link: Phanix's Blog

CC BY-NC-ND 2.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!