![](/img/trans.png)
[英]how to apply only the changes/diff from one branch to another in Git
[英]Git - How to selectively apply changes from one branch to another?
是否可以使用Git選擇性地將更改從一個分支應用到另一個分支?
更具體地說,我使用GitHub的公共dev
分支和部署的私有master
分支。 當對一個分支進行更改時,它們將需要應用於另一個分支,但是某些代碼行需要保持不同。 在我的例子中,它是一些css類和一個feed。
我是Git的新手,但我做了我的研究:
可以使用git merge --no-commit --no-ff
然后使用git mergetool
來選擇我想要的沖突。 問題是它只適用於沖突Git不能自動合並,所以我想要保持不同的東西在我有機會使用我的mergetool之前被替換。
git difftool --cached
是有用的,因為它允許我看到差異,但我需要復制我想要保留的內容並手動用文本編輯器替換它,因為我不能簡單地選擇並保存,就像我可以使用mergetool。
git cherry-pick
似乎將指定的提交應用於另一個,但我希望保持不同的可能會分散到不同的提交,這些提交可能不僅包括我想保持不同的內容。 我不能看到這個工作,除非我做了數百萬的提交會讓我發瘋。
另外要明確的是, 我不希望一個分支成為另一個分支,合並的情況似乎如此。 我想要兩個獨立的分支,各自的差異,並將變化從一個分支應用到另一個分支。
是否有更好的工作流程可以讓我通過應用他們的更改並保持一些差異來保留開發和部署版本? 我不介意使用單獨的存儲庫或不同的工具,如果它導致解決方案。
我也發現了關於修補的問題:
要創建補丁: git diff dev > master.patch
要應用它: patch < master.patch
我認為沒有辦法從同一個文件中選擇一部分提交。 我想說你需要簡單地重新計算你的代碼以將這些部分移動到不同的文件中。
順便說一句,如果你想采取從提交一些文件,你可以使用摘櫻桃與其他命令的組合作為解釋在這里 。
利用創建git分支很便宜並且不需要對工作目錄的實際內容產生影響這一事實。
dev
。 創建一個臨時分支。 它將指向dev
所做的相同提交: checkout -b for_master
據推測,您知道(或者可以很容易地找出) 在您(部分)想要的更改之前, dev
分支是最后一個提交之前的提交。 在這個例子中,假設該提交具有散列1457B4
('last before',得到它?)。
將for_master
分支git reset 1457B4
提交: git reset 1457B4
。 ( 不要使用--hard
開關!)
現在,您有一個工作目錄,其中包含dev
中的所有更改,但是從for_master
分支的POV中,這些更改是非分段和未提交的(雖然dev
分支仍然指向記錄所有更改的提交,因此工作是還是安全的)。
使用交互式登台( git add -p
和/或git add -e
),創建一個提交(或多個,如果您願意),其中包含您要應用於master
分支的所有且僅有的更改。
記下最后一次提交的哈希值(或給它一個標記)。 在這個例子中,我會說它的散列是C0DA
。
看看master
。
櫻桃挑選你剛剛提交的提交: git cherry-pick 1457B4..C0DA
。
(請注意,僅在git版本1.7.2之后才能選擇范圍。否則,您需要單獨挑選在步驟4中所做的所有提交。)
( 另請注意,當你挑選一個范圍時,范圍的開始是在第一個實際被選中之前的提交。)
這個過程與使用git checkout -p
相反,如所選答案中所述。 這可能是用於創建有用的cherry-pick
共享一些代碼,但也有很多的(一個項目的兩個主要版本之間如)差異兩個分支之間-able提交,你不希望有花很多在git checkout -p
的調用中忽略無關文件的時間。
就個人而言,我發現在同一個存儲庫中使用兩個不同的工作樹目錄很方便(一個用於源分支,一個用於目標),並在兩個命令shell之間切換,一個使用源分支目錄(worktree),另一個使用目的地。 但如果你git worktree
使用git worktree
功能,那可能不適合你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.