Jak zadano w tym pytaniu , chcę również wiedzieć, jak rozwiązać konflikt git stash pop
bez dodawania wszystkich modyfikacji do zatwierdzenia (tak jak robi to „git stash pop” bez konfliktu).
Moje obecne podejście jest bardzo nieciekawe, ponieważ robię to w ten sposób:
git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>
[Aktualizacja] Sposób na jego odtworzenie:
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: Dodano nowy plik o nazwie „trzeci” do przykładu, aby pokazać, że obejścia takie jak rozwiązanie scy działają tylko dla pustych HEAD, ale nie naprawiają początkowego problemu, że HEAD nie ma takiej samej treści jak na git stash pop
bez konfliktu.
git add
rozwiązane pliki konfliktu, skutecznie umieszczasz je w indeksie i nie chcesz ich mieć w naszym indeksie?git stash pop
, gdy nie występuje konflikt (ale z powiadomieniem, które pliki należy scalić).Odpowiedzi:
Nie podążaj za innymi odpowiedziami
Możesz ich śledzić :). Ale nie sądzę, że wykonanie zatwierdzenia, a następnie zresetowanie gałęzi w celu usunięcia tego zatwierdzenia i podobnych obejść sugerowanych w innych odpowiedziach to czysty sposób na rozwiązanie tego problemu.
Czyste rozwiązanie
Poniższe rozwiązanie wydaje mi się znacznie prostsze i sugeruje je sam Git - spróbuj wykonać
git status
w repozytorium z konfliktem:Zróbmy więc to, co sugeruje Git (bez robienia bezużytecznych zatwierdzeń):
git reset
do oznaczania konfliktu (ów) jako rozwiązanych i wycofywania zmian. Możesz go wykonać bez żadnych parametrów, a Git usunie wszystko z indeksu. Nie musisz wykonywaćgit add
wcześniej .git stash drop
, ponieważ Git nie robi tego w przypadku konfliktu.Przetłumaczone na wiersz poleceń:
Objaśnienie zachowania domyślnego
Istnieją dwa sposoby oznaczania konfliktów jako rozwiązane:
git add
igit reset
. Chociażgit reset
oznacza konflikty jako rozwiązane i usuwa pliki z indeksu,git add
oznacza również konflikty jako rozwiązane, ale utrzymuje pliki w indeksie.Celowe jest dodawanie plików do indeksu po rozwiązaniu konfliktu. W ten sposób możesz odróżnić zmiany od poprzedniej skrytki i zmiany wprowadzone po rozwiązaniu konfliktu. Jeśli ci się nie podoba, zawsze możesz użyć
git reset
usunąć wszystko z indeksu.Scal narzędzia
Zdecydowanie polecam użycie dowolnego z 3-kierunkowych narzędzi scalania do rozwiązywania konfliktów, np. KDiff3 , Meld itp., Zamiast robić to ręcznie. Zwykle automatycznie rozwiązuje wszystkie lub większość konfliktów. To ogromna oszczędność czasu!
źródło
git stash pop
nie powiedzie się konflikt.git stash drop
chyba że chcesz zachować tę skrytkę.Załóżmy, że masz taki scenariusz, w którym przechowujesz zmiany, aby wyciągnąć je z miejsca pochodzenia. Być może dlatego, że lokalne zmiany znajdują się
debug: true
w pliku ustawień. Teraz ciągniesz i ktoś wprowadził tam nowe ustawienie, tworząc konflikt.git status
mówi:W porządku. Postanowiłem pójść zgodnie z sugestią Gita: rozwiązałem konflikt i zobowiązałem się:
Teraz moja kopia robocza jest w stanie, który chcę, ale utworzyłem zatwierdzenie, którego nie chcę mieć. Jak mogę pozbyć się tego zatwierdzenia bez modyfikowania mojej kopii roboczej? Czekaj, jest na to popularne polecenie!
Moja kopia robocza nie została zmieniona, ale zatwierdzenia WIP już nie ma. Właśnie tego chciałem! (Pamiętaj, że nie używam
--soft
tutaj, ponieważ jeśli w Twojej skrytce znajdują się automatycznie scalone pliki, są one automatycznie przemieszczane i dlatego pliki te zostaną ponownie ustawione późniejreset
).Ale pozostała jeszcze jedna rzecz: Strona podręcznika dla
git stash pop
przypomina nam, że „Zastosowanie stanu może zakończyć się niepowodzeniem w przypadku konfliktów; w tym przypadku nie jest usuwane z listy skrytek. Trzeba rozwiązać konflikty ręcznie igit stash drop
później ręcznie zadzwonić ”. Tak właśnie robimy teraz:I zrobione.
źródło
git add <resolved conflict files>
następujegit reset HEAD
?git stash pop
bez konfliktu. Po prostu dodaj kolejny plik do HEAD przed wykonaniem konfliktu,git stash pop
a następniegit commit -a -m WIP
dodaj nowy plik do zatwierdzenia. Ale bez konfliktu tylko nowy plik pozostanie w HEAD, ale niegit stash pop
pliki.^
jest on używany jako specjalna kontynuacja linii i pozostawi Cię siedzącego na Więcej? monit zamiast wykonania polecenia. Zamiast używać:git reset --soft HEAD~1
. Zobacz, jak-do-i-delete-unpushed-git-commits?Zamiast dodawać zmiany wprowadzone w celu rozwiązania konfliktu, można użyć go
git reset HEAD file
do rozwiązania konfliktu bez wprowadzania zmian.Może być jednak konieczne dwukrotne uruchomienie tego polecenia. Raz oznaczono konflikt jako rozwiązany, a raz cofnął się o zmiany wprowadzane przez procedurę rozwiązywania konfliktu.
Możliwe, że powinien istnieć tryb resetowania, który wykonuje obie te rzeczy jednocześnie, chociaż nie ma go teraz.
źródło
pracował dla mnie.
Uwaga : może to być niebezpieczne, ponieważ nie próbuje scalić zmian ze skrytki do kopii roboczej, ale zamiast tego zastępuje ją ukrytymi plikami. Abyś mógł stracić swoje niezaangażowane zmiany.
źródło
git add .
wyreżyseruje WSZYSTKIE pliki, mówiąc git, że rozwiązałeś konfliktgit reset
usunie scenę z WSZYSTKICH przemieszczanych plików bez tworzenia zatwierdzeniaźródło
git add -u
wtedygit reset
Wygląda na to, że może to być odpowiedź, której szukasz, nie próbowałem tego jeszcze osobiście, ale wygląda na to, że może to załatwić sprawę. Za pomocą tego polecenia GIT spróbuje zastosować zmiany takie, jakie były wcześniej, bez próby dodania wszystkich do zatwierdzenia.
git stash apply --index
oto pełne wyjaśnienie:
http://git-scm.com/book/en/Git-Tools-Stashing
źródło
git stash pop
- czy jest sposób, aby to cofnąć i zrobić,git stash apply --index
gdy się dowiem, żegit stash pop
wpadnie w konflikt?git stash pop
i skończy się to konfliktami, skrytka nie zostanie usunięta ... więc możesz uruchomić,git reset --hard
aby cofnąć pop, a następnie wypróbować rozwiązanie, które zasugerowałem.git stash branch
będzie działał, który tworzy dla ciebie nową gałąź, sprawdza zatwierdzenie, w którym byłeś, kiedy ukryłeś swoją pracę, ponownie ją stosuje, a następnie upuszcza ukrytą skrzynkę, jeśli zostanie pomyślnie zastosowana. sprawdź toźródło
Najszybszym sposobem, jaki udało mi się znaleźć, jest rozwiązanie konfliktu, a następnie zrobienie
git add -u
, a następnie zrobieniegit reset HEAD
, co nawet nie wymaga zatwierdzenia.źródło
Według git stash pytania , po rozwiązaniu konfliktu,
git add <file>
są właściwym działaniem.Po przeczytaniu tego komentarza zrozumiałem, że zmiany są automatycznie dodawane do indeksu (zgodnie z projektem). Dlatego
git add <file>
kończy proces rozwiązywania konfliktu.źródło
To nie jest najlepszy sposób, aby to zrobić, ale działa:
źródło
file/path/to/your/file
zupełnie błędna, ponieważ