這是不是從直接鏈接到github上清楚,但我克隆回購,這使得它更加明顯:
如果您按日期查看它們,這會使所有提交看起來像重複(因爲它們低於合併兩個鏈的點)。
如果通過圖形型拓撲爲了查看它們,你可以看到更容易這是怎麼約(注意,這是截斷右邊以適合窗口):
* f721f0c (HEAD, origin/master, origin/HEAD, master) Merge branch 'master' of
|\
| * 97ffb07 Documentation updates.
| * 3e777f2 Update docs and VERSIONS.
| * 1f32407 Swapped append/prepend naming.
| * dadd1c9 Fixed example in Graphics.append() docs.
| :
| : [massive snippage, graph modified to show connections]
| :
| * d0d7f36 Merge pull request #165 from julianklotz/master
| |\
| | * e980526 Fix documentation Bug: CSS font attribute
| |/
* | 4c4fe1a Ticker clean up and bug fixes.
* | 6738d23 Documentation updates.
* | 4fe4e97 Update docs and VERSIONS.
* | c17aa05 Swapped append/prepend naming.
* | 36dadb6 Fixed example in Graphics.append() docs.
: |
: | [more snippage]
: |
* | 0960c56 Added Touch.disable() method. Fixed a very rare issue where Touch co
* | c20ae9d Merge pull request #165 from julianklotz/master
|\ \
| |/
|/|
| * 26eb5dd Fix documentation Bug: CSS font attribute
|/
* a21f210 Added SpriteSheetBuilder demo with MovieClip source.
* 20d5dc7 Improvements to resolving mouse position on stage. Should now support
: [yet more snippage]
你需要記住這裏是filter-branch
,像git中的一切,不是更改任何現有的提交,它只有增加了新的提交。當篩選器進行一些更改時,filter-branch
腳本會提交一個新的(不同)提交,與舊提交類似,但應用了該更改。因此,a21f210
及以下版本不變,但26eb5dd
與e980526
不同:它們具有相同的樹和相同的父代ID(a21f210
),但提交消息文本不同:一個以換行符結束,另一個不以。
一旦一些提交不同的是,每一個後代犯下-每一個承諾「後,」它的圖形,即中即承諾,必須也每個孩子是不同的,因爲每個提交包含ID( s)的父母,作爲他們自己的ID的一部分。 (任何git對象的ID是該對象內容的加密校驗和,並且提交的內容包括父ID)。
如果/當您將這樣的過濾結果推送到像github這樣的共享存儲庫時, 每該共享存儲庫的用戶必須根據過濾重新調整其副本。假設6738d23 Documentation updates.
是過濾之前在共享存儲庫中的內容,其他人都有6738d23
,但是您(在您的推送中)創建97ffb07 Documentation updates.
,其他人必須接受任何提交,它們的後代爲6738d23
,並將它們重新綁定到97ffb07
。這包括誰有4c4fe1a Ticker clean up and bug fixes.
(這顯然是你)。然後他們必須停止使用6738d23
並開始使用97ffb07
。
如果上述假設是錯誤的,如果97ffb07
是什麼在共享回購過濾前和6738d23
是新的,那麼每個人都必須停止使用97ffb07
版本,並開始使用6738d23
一個來代替。
這個「每個人都必須停止使用A並開始使用B」的東西是什麼使得重寫歷史變得如此痛苦,並且在可能的情況下被避免。如果有人錯過了「停止使用A,開始使用B」指令,他們很可能會創建一個合併 - 就像您所做的那樣 - 將舊的「A及其所有父母」的歷史合併回來,使其看起來(並且)成爲所有新的「B及其所有父母」歷史的重複。
要解決此問題,您必須擺脫合併,即重新編寫歷史記錄。
'爲了解決這個問題,你必須擺脫合併,即重新寫入歷史。「但是,如何?究竟需要做什麼。我一直在找這樣的問題,答案說你應該做什麼,但是這樣做並沒有幫助案件,因爲它已經完成了。 – 2017-09-29 22:06:30
「如何」部分可以通過多種不同的方式完成。要認識到的最重要的事情是:*一旦你完成了任務,由於你正在做的事情的性質,即通過複製來重寫歷史記錄,撤銷你所有的工作並且做出更大的混亂是非常容易的。 Git「希望」向其集合添加新的提交。想像Git喜歡Star Trek TNG的Borg:它會說「哦,這些看起來很新,我會把它們加入我的收藏!」例如,假設你正在和另一個叫Fred的人一起工作,並且你們都有一個Git回購(你有一個,他有一個),並且你分享工作...... – torek 2017-09-29 23:24:19
...並且你做了一個'git filter分支'在您的回購。這會複製您的提交,並在複製過程中進行一些更改(這些是「filter-branch」中的「過濾器」)。然後,Fred的Git連接到你的Git,並且認爲:*哇,看看所有那些閃亮的新提交,我將它們添加到我的集合中*現在Fred已經提交了兩倍提交,並且將Git連接到Fred的Git,並且Git說:*哇,看看所有那些閃亮的新提交,我會添加它們!*現在你們都提交了兩倍的提交。所以「重寫歷史」很難:你必須確保每個人都切換到新的提交。 @DouglasGaskell – torek 2017-09-29 23:26:20