簡體   English   中英

Git:如何僅合並修改的文件

[英]Git: how to merge modified files only

我有以下問題:我們在master分支中有一個大型產品。 另外,我們還有其他分支只有幾個文件,這些文件僅特定於該分支。 這些分支中的每一個都代表主要產品的插件。 因此,例如,當您獲得主要產品時,會收到很多文件,進行安裝等,然后在您決定獲得一個插件時,您會收到一個僅包含多個文件並通過上傳這些文件(並替換原始文件)的軟件包),您將安裝插件。

讓我們在master分支中有payment.php(以及許多其他文件)。 我有貝寶(Paypal)分支,該分支只有一個文件是payment.php。 現在,我修復了master的payment.php中的一個錯誤,並希望將此合並到paypal分支中。 但是,當我運行merge時,絕對所有文件都會添加到該分支中。 因此,最后,貝寶分支具有master分支的所有文件。 您是否偶然知道如何解決此問題? 我希望GIT僅合並存在於此分支中的文件,因此在上面的示例中,貝寶​​分支仍應僅包含一個文件(payment.php),並合並了錯誤修復程序。

這就是為什么要很好地管理分支機構,尤其是使用主題分支機構並向上合並的原因。

您應該在需要該修復程序的所有分支的共同祖先分支的主題分支上進行此修復,然后將其合並到master和paypal中:

x - x - x - x ------------- X (master)
|\                          |
| x - x - x ---- X (paypal) |
 \              /           /
  x (bugfix) ---------------

如果您已經進行了錯誤修復,並且錯誤地在母版上進行了錯誤修復,而不是在適當的合並基礎上進行,並且尚未發布母版上的歷史記錄,則應選擇或將其重新定位到正確的位置:

# If the bugfix commit is not at the tip of master, you can rebase to get it there:
git rebase -i <commit before the bugfix> master
# rearrange the list of commits to put the bugfix at the tip, save and quit

# Now either cherry-pick or rebase the commit to the right place
# (rebase is easier if the bugfix is actually several commits)

# Cherry-pick
# make a branch and cherry-pick
git checkout -b bugfix <SHA1 of merge base>
git cherry-pick <SHA1 of bugfix>
# remove the commit from master, assuming it's still on the tip
git checkout master
git reset --hard master^

# or rebase
# make the bugfix branch (assuming it's still on the tip)
git branch bugfix master
# and remove the commit from master (assuming it's still on the tip)
git checkout master
git reset --hard master^    # or if the bugfix is composed of n commits, master~n
# rebase the bugfix branch to the right place
git rebase --onto <SHA1 of merge base> master bugfix

如果歷史上已經公布,所有你能做的就是櫻桃挑bug修正到貝寶分公司,並記住下一次做正確的事:

git checkout paypal
git cherry-pick <SHA1 of bugfix>

為什么您的其他分支不包含master分支中的所有文件? 通過消除所有其他文件的麻煩,您使事情變得更加艱難。 尤其是如果您以后需要更改已經刪除的其他文件時,尤其如此。

你這樣做是錯的。 您應該在分支中擁有所有文件。

跟蹤分支之間(而不是分支之間)哪些文件不同是Git的工作。 這就是使用VCS的要點之一。

如果只想分發分支之間不同的文件,則可以通過腳本輕松提取這些文件。

將插件隔離在自己的git repo中,可以讓您在父項目上獨立地對其進行開發。

但是,如果您需要將它們直接包含在項目中,則最新的Git版本(git1.7.11,2012年6月)包括git子樹腳本 (先前由apenwarr 在GitHub開發 ,現已合並到主線git中)

這樣,您可以將一個存儲庫(及其歷史記錄)合並到另一個存儲庫中,並保留以后提取其歷史記錄的選項(與子樹合並相反)。
可以將其視為git子模塊的替代方案。

另一個選擇是git slave ,以保持父倉庫和子模塊緊密同步。

您可以執行以下操作: http : //nvie.com/git-model

(我希望這可行)

master將繼續是您的主要分支。 您從master創建了第二個分支,稱為bugfix 您從Bugfix創建了第三個分支,稱為plugin-foo

在plugin-foo中,刪除所有不需要的文件。 現在,每當對plugin分支中沒有的文件進行更改時,都可以在master分支中進行。 所有錯誤修正均進入錯誤修正分支。 您會定期將bugfix分支合並到master和plugin分支中。 這導致錯誤修正進入這兩個分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM