2015-09-16 26 views
2

我們面臨的情況是,我們正在爲我們公司(GA)定製Web應用程序,並需要通過請求發送一些對git上游回購的更改。上游的webapp是「AUS」。這些更改將在特定文件中進行,並且在工作完成之前已知。所有的工作(即使是AUS)都將在GA中被捕獲。共享(拉取請求)只有一些提交上游存儲庫

我們如何避免重複提交(從cherry-pickrebase),並保持整潔和易於遵循?

我爲此制定了一個「配方」,並希望分享它。

回答

2

我描述了SourceTree所看到的配方和顯示存儲庫狀態的屏幕截圖(因爲它一次顯示所有分支)。請注意,分支是'au','ga'和'master',而不是配方中使用的GPT-99_description_AU,GPT-99_description_GA和GPT-99_description。

(你可能會問,爲什麼有一個額外的線路和每個代碼塊之前的一段 - 我能拿它來格式化今天的唯一途徑)

  1. 創建3個分支。他們應該反映正在進行的問題,併爲AuScope和GA提供一個問題。我們還需要一個合併成

$ git checkout master # or whatever base branch we will be using 
$ git branch GPT-99_description 
$ git branch GPT-99_description_AU 
$ git branch GPT-99_description_GA 
  1. 在GA分支

完成所有的工作。

$ git checkout GPT-99_description_GA 
  1. 執行編輯,添加文件,並根據需要
  2. 刪除文件確定會去澳大利亞,因爲他們必須單獨提交的文件(否則怎麼會送我們只是那些提交到AUS?)
  3. 提交AUS文件。使用標識爲AUS文件提交的內容開始提交消息

$ git add <files> 
$ git commit -m "GPT-99 - AUS files - ..." 

也許不是使用消息使用標記。稍後再看。

  1. 提交GA文件。不需要識別消息。

$ git add <files> 
$ git commit -m "GPT-99 - ..." 

SourceTree view after add, delete, edit

  1. 切換到AuScope分支

Switch to the AuScope branch 
  1. 櫻桃挑AuScope提交(查看日誌)

$ git cherry-pick SHA#1 
$ git cherry-pick SHA#2 
... 

After cherry-picking

  1. 現在是什麼在這裏發生的是,提交已被複制,並且將存在於GA的AUS分支機構。提交是獨立的(它們有不同的SHA),但它們的實質是相同的 - 如果兩者都重播,將會有衝突,因爲兩者都會嘗試添加/刪除/編輯同一事物。我們可以使用https://git-scm.com/book/en/v2/Git-Branching-Rebasing#Rebase-When-You-Rebase中描述的git技巧,其中複製的提交將具有用於標識提交相同的補丁標識。這允許我們rebase和git將解析不同的提交只是一個

$ git rebase --onto GPT-99_description GPT-99_description_AU GPT-99_description_GA 

enter image description here

  1. 重複的提交現在鞏固。然而GA分支沒有AUS變化。爲了做到這一點,我們合併:

$ git checkout GPT-99_description_GA 
$ git merge GPT-99_description_AU 
  1. 現在的庫是在所有的變化都在GA分支的狀態和旨在改變發送一個拉請求AuScope都在AU分支。

After merge - separate branch to do a pull request on