簡體   English   中英

從特定提交創建 PR

[英]Creating a PR from a specific commit

我想用一次提交創建一個 PR,所以我用提交 SHA 簽出一個新分支,

git checkout -b new-branch 8517c80183607461ea

我如何從這里創建 PR?

由於Git分支的工作方式,僅憑一次提交就不足以創建分支。 您可能會拖入更多提交。

例如,假設您的存儲庫如下所示。

A - B - C [master]
         \
          D - E - F [feature]

masterfeature只是指向提交的標簽。 提交C的master點。提交F的feature點。

Git提交不是孤立存在的。 他們把整個歷史都帶走了。 沒有E,D,C,B和A的情況下F不能存在。如果按下feature則F將E和D一起帶來(假設C已經被按下)。

假設您只想發送PR的PR。因此您在E建立分支。

$ git checkout -b new-branch E

A - B - C [master]
         \
          D - E [new-branch]
               \
                F [feature]

完成的所有操作均創建了一個名為new-branch的標簽,該標簽指向提交E。提交的結構保持不變。 如果您隨后按下new-branch ,它將拖動D。 這就是為什么有時當您認為您只推送少量提交時,PR包含更多提交的原因。


為了真正只推送一個提交,您需要將其與歷史分離。 您可以使用git cherry-pick做到這一點。 這基本上就是提交,將其變成補丁,然后在其他地方對其進行補丁。

回到您的原始存儲庫...

A - B - C [master]
         \
          D - E - F [feature]

您將在master創建一個新分支。

$ git checkout -b new-branch master

          [new-branch]
A - B - C [master]
         \
          D - E - F [feature]

(請注意,除了指向C的新分支標簽外,其他都沒有更改。)

然后選擇E。這會將E復制為C之上的新提交。可能存在沖突,請按正常方式解決它們。

$ git cherry-pick E

          E1 [new-branch]
         / 
A - B - C [master]
         \
          D - E - F [feature]

現在,您可以按new-branch ,只有E1會出現在PR中。

您需要將new-branch推送到Github,然后打開一個請求請求。 這將包括從8517c80183607461ea可達到的所有提交,但尚未包括在master的歷史中。

如果你想包括8517c80183607461ea ,那么你需要重訂new-branch上使用主git rebase -i master ,並刪除除一個提到的所有行8517c80183607461ea 在重新設置8517c80183607461ea之后,分支的new-branch將直接在主8517c80183607461ea上包含重新設置的8517c80183607461ea及其新的提交ID,您可以推送分支/發出拉取請求。

我在使用Schwern的答案時遇到了一些麻煩,因為在進行提交時犯了一個在派生項目的主人身上的錯誤( 這里我稱之為菜鳥錯誤)。

遵循Schwern的圖,可以說我已經在C分支了一個項目,並在其他提交方面繼續掌握。 在這里,我添加一個星號來表示叉上正在發生新的更改:

A - B - C - D* - E* - F* [master]

如果您只想挑選某些提交(例如DE ),則不應該執行以下操作:

git checkout -b new-branch upstream/master
git cherry-pick <hash of commit D>
git cherry-pick <hash of commit E>
git push -u origin new-branch

在這種情況下,您嘗試從F*分支出master節點,然后選擇先前的提交會警告您

“以前的挑剔現在是空的,可能是由於解決沖突的緣故。”

因為您要在新分支上添加相同的舊提交。

相反,您應該做的是:

git checkout -b new-branch <hash of commit E>
git push -u origin new-branch

A - B - C - D* - E* - F* - G* [master]
                  \
              D* - E* [new-branch]               

之后,您就可以僅使用選定的提交來發出拉取請求。

直接在github上編輯特定文件即可。 Github 會自動做一個補丁分支,所以你可以從你的分支中 PR 一個文件。

暫無
暫無

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

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