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ć?

Jez
źródło

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.

CB Bailey
źródło
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

Anas Alkhatib
źródło
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
Tomek
źródło