簡體   English   中英

當兩個人正在處理它們並同時更改提交歷史記錄時,如何同步 git repos?

[英]How to sync git repos when two people are working on them and changing the commit history simultaneously?

我目前正在重新排序、壓縮和更改 git 分支中的一些內容,該分支有很多待合並的提交(目前大約 300 個)需要合並。 我同時面臨着困難。

考慮分支當前有提交ABCDEFG-...等等,其中 A 是未合並到目標分支的最舊提交。 現在我做了一些更改,比如提交 D(將一些錯誤壓縮到它,重新排序等)。 現在我的分支看起來像ABC-D1-E1-F1-G1-H1-I1-...等等(D 的提交哈希更改和任何比 D 更新的提交)。

假設同時另一個人做了一些其他更改,說,提交 H。現在在他的本地分支上,它看起來像ABCDEFG-H2-I2-J2-K2-...等等。 現在,我們中的任何一個都將我們的更改推送到遠程分支(假設我這樣做了)。 現在在遠程分支上,提交是ABC-D1-E1-F1-G1-H1-I1-...等等,而在 B 的本地分支上,提交是ABCDEFG-H2-I2-J2-K2-...等等。

我的主要問題是,B 人如何以一種允許他將更改推送到遠程分支的方式重新設置他的本地分支,同時保留他在本地分支中所做的更改(類似於ABC-D1-E1-F1-H3-I3-J3-...等等。我可以接受一些合並沖突,但不想丟失 A 人或 B 人所做的更改)。 有人可以提出解決這個問題的好方法嗎?

考慮到分支當前有提交 ABCDEFG-... 等等...現在我做了一些更改,比如說提交 D(將一些錯誤壓縮到它,重新排序等)...假設同時另一個人做了一些其他的改變說,提交H。

停止。 不要這樣想。 任何人(也就是說,任何人)都不應該對與其他任何人共享的分支中的現有提交進行更改。

如果您和“另一個人”都能夠直接對同一個分支進行更改, 1那么你們都不能對分支的現有歷史進行任何更改。 這會讓你完全進入你所描述的情況,這種情況是完全站不住腳的。

Git 倫理的第一條規則是:不要變基(或以其他方式修改)共享分支的歷史。 根據假設,這個分支是共享的。


1. 但我們可以走得更遠。 這種假設你和“另一個人”能夠直接對同一個分支進行更改,首先不應該是這種情況! 這可以說是對 Git 的完全濫用。 不同的人應該在不同的分支上工作,他們的工作只有通過合並才能團結起來。 Git 中的分支非常輕量級。 使用它們。

我在這里會非常不同意馬特。 我喜歡說的方式是“歷史重寫”(通過 rebase 或任何其他方法,我們用一些新的和改進的替換來刪除或替換一些現有的提交)需要使用現有的所有各方之間的事先協議提交。

也就是說,假設有一個名為“proposal”的分支,許多人閱讀,有些人偶爾使用git push編寫。 各方都同意,任何給定的提案都可以撤回或修改。 在這種情況下,不依賴於早期提案的提案將被重新設置。 確實依賴於早期提案的提案將被刪除或重寫。 由於每個人都事先同意了這一點,如果您決定要放棄您提出的某些提案,您只需引入當前版本的分支,rebase 以放棄您的提案,然后推送結果——除非,也就是說,放棄你的提議會損害別人的提議。 這種情況下,您可以聯系其他人(可能通過電子郵件或電話),然后你們兩個就可以解決問題。

如果你要提出一個提案並且你運行git fetch並發現分支已經被重寫以刪除你所依賴的提案,你要么自己采納那個提案——現在這是你的責任——然后把它放回去,或者你聯系原始提案的所有者並確定該怎么做。

如果您要提出不依賴於其他任何人的提案,您可以自由地獲取、添加和推送。

如果提案很復雜並且需要多個用戶同意和/或需要一個長期存在的分支,您(和其他任何相關人員)創建一個單獨的“提案分支”並開始使用它。 提案的所有各方都同意或不同意這個分支也有某些重寫規則。 這樣一來,每個人都為即將發生的任何事情提前做好了准備。

如果您有一個進入共享存儲庫的“私人”提案(以便在需要時可以成為共享提案),並且您是目前唯一一個在處理它的人,您只需要同意一個人——你自己——只要你選擇重寫它。 這通常相當容易。 😀

暫無
暫無

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

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