簡體   English   中英

“git pull --rebase --autostash”不應該總是自動彈出存儲嗎? 即使發生沖突?

[英]Shouldn't "git pull --rebase --autostash" always pop the stash automatically? Even when there are conflicts?

幾年前,在之前的一份工作中,我們將 git 與一個(舊)插件一起使用,稱為“ git up ”。
https://github.com/aanand/git-up
“不再維護或支持此插件。”
過去更新您的工作區非常容易:
只需鍵入“git up”,查看哪些文件有沖突,編輯這些文件以解決沖突,執行“git add”,就完成了。

我現在在另一家公司工作。 他們今年早些時候開始使用 git。 我們沒有一個清晰簡單的方法讓每個人都更新我們的工作區。 我想介紹一種非常簡單的方法來更新您的工作區。 盡可能簡單 沒有提交,沒有合並。

似乎最簡單的方法是使用帶有 --rebase 和 --autostash 標志的“git pull”。 您可以通過在 .gitconfig 文件中設置這些值來執行相同的操作。 或者使用別名:

git config --global alias.up '!git fetch && git rebase --autostash origin'

這有點工作。 當沒有沖突時,stash 會自動彈出。 除了鍵入“git up”或“git pull --rebase --autostash”之外,我不需要做任何事情。

有一個問題。 當出現沖突時,git 拒絕將 stash 應用回我的工作區。 它說:

Applying autostash resulted in conflicts.
Your changes are safe in the stash.
You can run "git stash pop" or "git stash drop" at any time.
Successfully rebased and updated refs/heads/main.
$ git stash list
stash@{0}: autostash
$ 

當我輸入“git stash pop”時,stash 被彈出,我的本地更改會再次自動編輯到我的工作區中(使用通常的 >>>> 和 <<<< 標記)。 這總是成功的。

請注意,當我更改了一個也在遠程存儲庫上更改的文件時,git 總是拒絕自動彈出存儲。 不僅是在發生真正的沖突時(同一行上的更改)。 而且當我的更改與遠程存儲庫的更改相去甚遠時。 這讓我懷疑我看到的行為真的不是故意的。

但是為什么 --autostash 不會自動彈出存儲? 我與我公司的 git 支持人員進行了交談。 他們還希望藏匿處自動彈出。 即使有沖突。 我做了一些谷歌搜索。 我發現沒有任何跡象表明藏匿處不應自動彈出。

所以我的問題是:我能期待什么? 當我使用 --autostash 時,stash 是否應該總是自動彈出 還是我看到的行為正常? 這是一個錯誤嗎? 我們本地的 git-team 是否更改了可執行文件或全局配置中的某些內容? (他們說他們沒有)。

行為與 2.26.2 和 2.33 相同。 謝謝。

您看到的行為(呃,行為)正常的,因為操作仍在進行中 在操作完成后,自動存儲應該被彈出——或者更確切地說,是丟棄。 確實,在這種情況下,操作的 rebase部分已經完成,但是 stash 沒有完全應用,所以git stash apply步驟失敗了:

Applying autostash resulted in conflicts.

(我認為Git 做了一個git reset --hard來消除對git stash apply的嘗試,讓你在這一點上自己做,但我不使用 autostash。請注意,運行git stash pop發生沖突,並且會只應用,而不是丟棄,藏匿處。)

我個人不喜歡 autostash,因為它過於復雜:它包含一個多步驟操作,包括進行 stash 提交、rebase,然后應用和刪除 stash 提交。 相反積攢的,我建議你重訂之前剛剛提交 這樣,最后一次提交是 rebase 的一部分,因此只需完成一個操作。

完成后,您可以使用git reset刪除重新提交的提交,如果甚至需要的話:我喜歡較小的提交,我可以稍后在它們“准備好迎接黃金時間”時進行合並,並留下一個一堆小的“這不是我想要的,但它是進步”在我正在進行的工作中的提交有助於解決這個問題。 最終,我運行了一個git rebase -i或一系列的命令來對小型提交進行排序和組合。

(不是為了讓這成為對git stash的小咆哮,而是...... git stash本身通常很糟糕。避免它。)

事實證明這是一個錯誤。 使用 autostash 時,stash 應該自動彈出。 即使有沖突。 正如我所料。 今年早些時候(或去年)有人破壞了該功能。 我檢查了 git 源代碼的最新版本(“下一個”)。 彈出再次自動發生。

還有一個問題。 在彈出之后,並且在沒有問題的情況下應用更改之后,我希望存儲也會自動刪除(丟棄)。 那不會發生。 我不知道這是故意的,還是一個錯誤。 我懷疑這是一個錯誤。 如果一切正常,為什么要保留藏匿處? 我敢打賭沒有人知道,也沒有人敢決定是否解決這個問題。

可悲的是:我問了一大群人當前的行為(沒有自動彈出)是故意的還是錯誤的。 同事,安裝/維護我們的 git 的人,我們內部的 git 支持人員,我們當地的 git 專家,我們的外部 git 支持團隊。 和這里。 我得到了無數的答案。 他們沒有一個是正確的。 大多數人甚至沒有回答這個問題:“我不喜歡 rebase,我不喜歡 autostash,我不喜歡 stash,你為什么不做我所做的,那更好”。 沒有人真正回答我的問題。 我不怪這里試圖回答的人,但在逆流划船2個月后,我有點惱火。 對不起。

我很高興我堅持了下來。 我很高興這個問題很快就會得到解決。 現在唯一剩下的就是確保當我們不再需要它時,它會被丟棄。 如有必要,我會自己修復它並將修復提供給 git 存儲庫。

暫無
暫無

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

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