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
.
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
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:
- Pobierz pilota do repozytorium. Na przykład:
git fetch origin master
- Uruchom git merge-base:
git merge-base FETCH_HEAD master
- 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.
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.
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)
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.
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
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.
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.
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ć).
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
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
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.
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.
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