Rozwiązywanie konfliktu scalania typu „oba dodane” w git?


138

Zmieniam bazę w git, a jeden konflikt, który otrzymuję, to „oba dodane” - to znaczy dokładnie ta sama nazwa pliku została dodana niezależnie w mojej gałęzi i gałęzi, na której się zmieniam. git statusmówi mi:

# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both added:         src/MyFile.cs

Moje pytanie brzmi, jak mam to rozwiązać? Czy muszę używać narzędzia do scalania, czy jest sposób, w jaki mogę to zrobić tylko z wiersza poleceń? Jeśli ja git rm src/MyFile.cs, skąd git wie, którą wersję pliku chcę usunąć, a którą zachować?

Odpowiedzi:


139

Jeśli użyjesz git rmgit, usuniesz wszystkie wersje tej ścieżki z indeksu, więc twoja akcja rozstrzygania pozostawi cię bez żadnej wersji.

Możesz użyć, git checkout --ours src/MyFile.csaby wybrać wersję z gałęzi, dla której chcesz zmienić bazę lub git checkout --theirs src/MyFile.cswybrać wersję z gałęzi, na której chcesz zmienić bazę.

Jeśli chcesz mieszać, musisz użyć narzędzia do scalania lub edytować je ręcznie.


1
Dzięki. I właśnie zdałem sobie sprawę, że powodem, dla którego narzędzie do scalania nie działa, było to, że git tworzy pliki .LOCAL i .REMOTE do scalenia, ale nie plik .BASE. Myślę, że powinno po prostu utworzyć pusty plik .BASE. Jeśli ręcznie utworzysz pusty plik .BASE, narzędzie do scalania będzie działać poprawnie.
— Jez


1
Więc mówisz, że zostanie to naprawione w najnowszej wersji gita?
— Jez

1
@Jez: Jest w wersjach git> = 1.7.9.1 git.kernel.org/?p=git/ ...
— CB Bailey

21
Od @Tom Answers: Robiąc ... git checkout --ours someFile Może się wydawać, że nic nie zrobił podczas wykonywania statusu git. Tylko pamiętaj, aby zrobić to później. git add someFile git status
— pec

72

Czasami wydaje mi się to mylące przy użyciu opcji --theirsi, --oursaby określić, skąd pochodzi plik. Przez większość czasu mój będzie znajdował się w gałęzi, którą przebudowuję, o której mowa --theirs!

Możesz także użyć git checkout <tree-ish> -- src/MyFile.cs

Gdzie <tree-ish>można zastąpić nazwę gałęzi lub identyfikator zatwierdzenia, który zawiera plik, który chcesz zachować.

git checkout 6a363d8 -- src/MyFile.cs

git checkout my_branch -- src/MyFile.cs

git checkout HEAD -- src/MyFile.cs


42

Robiąc ...

git checkout --ours someFile

Może się wydawać, że nic nie zrobił podczas wykonywania statusu git.

Tylko pamiętaj, aby zrobić to później.

git add someFile
git status
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.