Czy istnieje opcja Git-merge --dry-run?

Scalam się w zdalnej gałęzi, która może mieć wiele konfliktów. Skąd mam wiedzieć, czy będzie konflikt, czy nie?

Nie widzę czegoś takiego jak --dry-run Na git-merge.

 594
Author: Mahmoud Adam, 2009-02-01

13 answers

Jak wspomniano wcześniej, przepuść flagę --no-commit, ale aby uniknąć szybkiego commita, przepuść również --no-ff, w ten sposób:

$ git merge --no-commit --no-ff $BRANCH

Aby zbadać wprowadzone zmiany:

$ git diff --cached

I możesz cofnąć scalenie, nawet jeśli jest to fast-forward merge:

$ git merge --abort
 650
Author: mipadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-01 10:17:22

Musiałem zaimplementować metodę, która automatycznie wykrywa konflikty między repozytorium a jego zdalnym. To rozwiązanie wykonuje scalanie w pamięci, więc nie dotknie indeksu ani drzewa roboczego. Myślę, że to najbezpieczniejszy sposób na rozwiązanie tego problemu. Oto jak to działa:

  1. Pobierz pilota do repozytorium. Na przykład: git fetch origin master
  2. Uruchom git merge-base: git merge-base FETCH_HEAD master
  3. Uruchom git merge-tree: git merge-tree mergebase master FETCH_HEAD (mergebase jest szesnastkowym identyfikatorem, który merge-base wydrukowane w poprzednim kroku)

Teraz Załóżmy, że chcesz połączyć zdalny master z lokalnym master, ale możesz użyć dowolnych gałęzi. git merge-tree wykona scalenie w pamięci i wydrukuje wynik na standardowe wyjście. Grep dla wzoru << lub >>. Możesz też wydrukować dane wyjściowe do pliku i to sprawdzić. Jeśli znajdziesz linię zaczynającą się od 'changed in both', najprawdopodobniej dojdzie do konfliktu.

 200
Author: akostajti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-29 21:50:35

Moje proste rozwiązanie brute-force to:

1: Utwórz gałąź Pre-master (Z master of course)
2: Połącz wszystkie rzeczy, które chcesz zrobić z tym pre-mistrzem
wtedy możesz zobaczyć, jak doszło do scalenia bez dotykania mistrza.
3a: Scal pre-master Do master lub
3b: połącz wszystkie gałęzie wydane przez wannabe w master

W każdym razie posłuchałbym rady @ orange80.

 45
Author: hades,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-04 10:58:25

Cofnięcie połączenia z Gitem jest tak proste, że nie powinieneś się martwić o suchą rundę:

$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world

EDIT: jak zaznaczono w komentarzach poniżej, jeśli masz zmiany w katalogu roboczym lub staging area, prawdopodobnie będziesz chciał je ukryć przed wykonaniem powyższego (w przeciwnym razie znikną po git reset powyżej)

 43
Author: Brian Phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-15 20:16:59

Zrobiłem pseudonim do robienia tego i działa jak urok, robię to:

 git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '

Now I just call

git mergetest <branchname>

Aby dowiedzieć się, czy są jakieś konflikty.

 30
Author: Okonomiyaki3000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-18 06:10:08

Po prostu odróżnij bieżącą gałąź od zdalnej, to powie Ci, co się zmieni, gdy wykonasz pull/merge.

#see diff between current master and remote branch
git diff master origin/master
 24
Author: timh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-10 03:31:39

Używam do tego polecenia request-pull git. Pozwala zobaczyć każdą zmianę, która nastąpiłaby podczas scalania, , ale bez robienia czegokolwiek na lokalnych lub zdalnych repozytoriach.

Na przykład, wyobraź sobie, że chcesz scalić gałąź o nazwie "feature-x" do gałęzi master

git request-pull master origin feature-x

Pokaże Ci podsumowanie tego, co się stanie (bez robienia czegokolwiek):

The following changes since commit fc01dde318:
    Layout updates (2015-06-25 11:00:47 +0200)
are available in the git repository at:
    http://fakeurl.com/myrepo.git/ feature-x
for you to fetch changes up to 841d3b41ad:
----------------------------------------------------------------
john (2):
    Adding some layout
    Refactoring
ioserver.js            |   8 +++---
package.json           |   7 +++++-
server.js              |   4 +--
layout/ldkdsd.js       | 277 +++++++++++++++++++++++++++++++++++++
4 files changed, 289 insertions(+), 7 deletions(-)
create mode 100644 layout/ldkdsd.js

Jeśli dodasz parametr -p, otrzymasz również pełny tekst łaty, dokładnie tak, jak gdyby robiłaś git diff na każdym zmienionym pliku.

 17
Author: ArnaudR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-26 10:24:45

Dziwię się, że nikt jeszcze nie zasugerował używania łatek.

Powiedz, że chcesz przetestować połączenie z your_branch do master (zakładam, że maszmaster sprawdzone):

$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch
To powinno wystarczyć.

Jeśli pojawią się błędy typu

error: patch failed: test.txt:1
error: test.txt: patch does not apply

Oznacza to, że łatka nie powiodła się i połączenie wywołałoby konflikty. Brak wyjścia oznacza, że patch jest czysty i będziesz mógł łatwo połączyć gałąź


Zauważ, że to nie zmieni się w rzeczywistości Twoje działające drzewo (oczywiście oprócz tworzenia pliku łatki, ale możesz to bezpiecznie usunąć później). Z dokumentacji git-apply:

--check
    Instead of applying the patch, see if the patch is applicable to the
    current working tree and/or the index file and detects errors. Turns
    off "apply".

uwaga dla każdego, kto jest mądrzejszy/bardziej doświadczony z Gitem niż ja: proszę dać mi znać, jeśli się mylę i ta metoda pokazuje inne zachowanie niż zwykłe scalanie. Wydaje się dziwne, że w ciągu ponad 8 lat istnienia tego pytania nikt nie sugerowałby tego pozornie oczywistego rozwiązania.

 15
Author: HackerCow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-14 06:32:59

To może być interesujące: z dokumentacji:

Jeśli próbowałeś połączenia, które spowodowało złożone konflikty i chcesz zacznij od nowa, możesz odzyskać za pomocą git merge --abort .

Ale można też zrobić to naiwnie (ale wolno):

rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)

(uwaga: nie zadziała tylko klonowanie do /tmp, potrzebujesz kopii, aby mieć pewność, że niezatwierdzone zmiany nie będą ze sobą kolidować).

 7
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-17 03:00:21

Zdaję sobie sprawę, że jest to stare pytanie, ale jest to pierwsze, które pojawia się w wyszukiwarce Google.

Git wprowadził opcję --FF-only podczas scalania.

From: http://git-scm.com/docs/git-merge


--FF-only

Odmowa scalenia i zakończenia ze statusem niezerowym, chyba że bieżąca głowica jest już aktualna lub połączenie może zostać rozwiązane jako przewijanie do przodu.

Zrobienie tego spowoduje próbę połączenia i przewijanie do przodu, a jeśli nie może, przerywa i podpowiada, że przewijanie do przodu nie może być wykonane, ale pozostawia działającą gałąź nietkniętą. Jeśli może przewijać do przodu, to wykona scalenie na działającej gałęzi. Ta opcja jest również dostępna na git pull. W ten sposób można wykonać następujące czynności:

git pull --ff-only origin branchA #See if you can pull down and merge branchA

git merge --ff-only branchA branchB #See if you can merge branchA into branchB
 7
Author: Jason McKindly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-11 20:10:41

Używam git log aby zobaczyć co się zmieniło na gałęzi feature z gałęzi master

git log does_this_branch..contain_this_branch_changes

Np.-aby zobaczyć jakie commity znajdują się w gałęzi feature, która nie została/nie została scalona do master:

git log master..feature_branch
 5
Author: nelsonenzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-02 23:20:07

Jeśli chcesz przewijać z B do A, musisz upewnić się, że Git log B..A nie pokazuje nic, tzn. A nie ma nic, czego B nie ma. Ale nawet jeśli B..A ma coś, możesz nadal być w stanie połączyć się bez konfliktów, więc powyższe pokazuje dwie rzeczy: że będzie przewijanie do przodu, a tym samym nie dostaniesz konfliktu.

 2
Author: Erik Allik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-24 14:30:55

Utwórz tymczasową kopię swojej kopii roboczej, następnie połącz ją z nią i różnicuj obie.

 -3
Author: vanboom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-05 17:23:27