如何在沒有提交的狀況下解決git stash衝突?

正如在這個問題中要求的那樣 ,我也想知道如何解決衝突的git stash pop而不添加對提交的全部修改(就像「git stash pop」而沒有衝突)。 git

我目前的方法很是不酷,由於我這樣作: vim

git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>

[更新]一種重現它的方法: 併發

mkdir foo; cd foo; git init
echo "1" > one
echo "2" > two
git add -A; git commit -m "first"
echo "1.1" > one
echo "2.1" > two
git stash
echo "2.2" > two
git commit -a -m "second"
echo "Only this file would stay in HEAD without the conflict" > third
git add third
git stash pop
git status

2016-06-27:在示例中添加了一個名爲「third」的新文件,以顯示scy解決方案的解決方法僅適用於空HEAD,但不解決HEAD不具備相同內容的初始問題對於沒有衝突的git stash popapp


#1樓

假設您有這種狀況,您能夠隱藏更改以從原點拉出。 多是由於您的本地更改只是debug: true在某些設置文件中爲debug: true 。 如今你拉,有人在那裏引入了新的設置,形成了衝突。 工具

git status說: this

# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      src/js/globals.tpl.js
no changes added to commit (use "git add" and/or "git commit -a")

好的。 我決定採用Git的建議:我解決了衝突並承諾: spa

vim src/js/globals.tpl.js
# type type type …
git commit -a -m WIP   # (short for "work in progress")

如今個人工做副本處於我想要的狀態,可是我建立了一個我不想擁有的提交。 如何在不修改個人工做副本的狀況下襬脫該提交? 等等,有一個流行的命令! .net

git reset HEAD^

個人工做副本還沒有更改,但WIP提交已消失。 這正是我想要的! (注意我在這裏沒有使用--soft ,由於若是你的存儲中有自動合併的文件,它們會自動暫存,所以你最終會在reset後再次暫存這些文件。) 命令行

可是還剩下一件事: git stash pop的手冊頁提醒咱們「應用狀態會因衝突而失敗;在這種狀況下,它不會從存儲列表中刪除。你須要手動解決衝突並調用git stash drop以後手動git stash drop 。「 這正是咱們如今所作的: debug

git stash drop

並作了。


#2樓

git stash branch將工做,它會爲您建立一個新分支,檢查您在保存工做時所處的提交,在那裏從新應用您的工做,而後在成功應用時刪除存儲。 檢查一下


#3樓

git checkout stash -- .

爲我工做。

注意 :這可能很危險,由於它不會嘗試將存儲中的更改合併到工做副本中,而是使用存儲文件覆蓋它。 所以,您可能會丟失未提交的更改。


#4樓

不要按照其餘答案

好吧,你能夠關注他們:)。 但我不認爲執行提交而後重置分支以刪除該提交和其餘答案中建議的相似解決方法是解決此問題的乾淨方法。

清潔解決方案

如下解決方案彷佛對我來講更清晰, Git自己提出了這個解決方案 - 嘗試在存儲庫中執行git status併發生衝突:

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

那麼讓咱們作Git建議的事情(不作任何無用的提交):

  1. 手動(或使用一些合併工具 ,見下文)解決衝突。
  2. 使用git reset將衝突標記爲已解決並取消暫停更改。 您能夠在沒有任何參數的狀況下執行它,Git將從索引中刪除全部內容。 您沒必要在執行git add以前。
  3. 最後,使用git stash drop刪除存儲,由於Git在衝突時不會這樣作。

轉換爲命令行:

$ git stash pop

# ...resolve conflict(s)

$ git reset

$ git stash drop

默認行爲的說明

有兩種方法能夠將衝突標記爲已解決: git addgit reset 。 雖然git reset將衝突標記爲已解決並從索引中刪除文件,但git add還會將衝突標記爲已解決,但會將文件保留在索引中。

解決衝突後將文件添加到索引是故意的。 這樣,您能夠區分更改與先前存儲的更改以及解決衝突後所作的更改。 若是您不喜歡它,您能夠隨時使用git reset從索引中刪除全部內容。

合併工具

我強烈建議使用任何3路合併工具來解決衝突,例如KDiff3Meld等,而不是手動執行。 它一般自動解決全部或大多數衝突。 節省大量時間!


#5樓

根據git stash問題 ,在解決衝突後, git add <file>是正確的行動方案。

在閱讀此評論後 ,我瞭解到更改會自動添加到索引中(按設計)。 這就是git add <file>完成衝突解決過程的緣由。

相關文章
相關標籤/搜索