Jak połączyć bieżącą gałąź z inną gałąź

Mam dwie gałęzie: master i dev. Zawsze pracuję nad dev i sprawdzam kod do gałęzi master dopiero po zatwierdzeniu go do użytku produkcyjnego. Kiedy to robię, muszę zrobić co następuje:

git checkout master
git merge dev
git checkout dev
To strasznie gadatliwe, a ponieważ robię to często, chciałbym to zminimalizować. Czy jest jakakolwiek Komenda git, której mogę użyć do scalenia z aktualnej gałęzi dev do innej gałęzi master bez konieczności wpierw kasowania gałęzi master? Coś może w stylu:
git merge dev to master

Byłoby Super. Przejrzałem dokumentację Gita i nic nie widziałem.

Author: Nic Wortel, 2010-09-09

7 answers

1. Dodaj zdalny alias dla lokalnego repozytorium, np:

git remote add self file:///path/to/your/repository

(lub w windows git remote add self C:\path\to\your\repository)

2. Push to the self remote, ex:

git push self dev:master
 90
Author: zerome,
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-10-04 17:57:44

Obecna najczęściej głosowana odpowiedź przez @ zerome jest dobra, ale jest trochę niepotrzebnie gadatliwa.

W bazie Twojego Git repo możesz po prostu zrobić to: git push . dev:master

Bardziej uogólnionym rozwiązaniem, które działałoby gdziekolwiek w drzewie byłoby:

git push $(git rev-parse --show-toplevel) dev:master
 53
Author: Kevin Lyda,
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-10-03 02:46:41

Najlepiej byłoby użyć aliasu, umieszczonego w Twoim globalnym gitconfig (~/.gitconfig):

[alias]
    merge-to = "!f() { git checkout $1 && git merge $2 && git checkout -; }; f"

Tak, że można go wywołać z dowolnego repozytorium jako

git merge-to master dev
 43
Author: Cascabel,
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-10-06 22:30:16

Mała modyfikacja z aliasu Jefromi, która nie wymaga wpisywania w bieżącej gałęzi.

Więc używasz go jak: git merge-to dev.

To przełączy się na gałąź dev, połączy ją z CURRENT, a następnie przełączy się z powrotem.

Na przykład, zakładając, że jesteś na gałęzi master, połączy master z dev i nadal będziesz na master.

Na pewno trafi do moich dotfiles :)

[alias]
  merge-to = "!gitmergeto() { export tmp_branch=`git branch | grep '* ' | tr -d '* '` && git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset tmp_branch; }; gitmergeto"
 38
Author: Dmytrii Nagirniak,
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
2011-10-18 03:08:47

To jest stare, ale...

Połączenie rozwiązań z @kevin-lyda i @dmytrii-nagirniak powyżej. Ten alias łączy bieżącą gałąź z podaną gałąź. Używa metody remotes with i używa komend git, aby uzyskać kontekst.

[alias]
    merge-to = "!gitmergeto() { git push \"`git rev-parse --show-toplevel`\" `git rev-parse --abbrev-ref HEAD`:$1; } && gitmergeto"

Do użycia jak:

git merge-to other-branch-name
 6
Author: tField,
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
2016-03-03 19:44:02

Aby scalić bieżącą gałąź do innej gałęzi bez sprawdzania drugiej gałęzi:

Fast-forward merge

To naprawdę proste. Z definicji fast-forward merge oznacza po prostu, że wskaźnik gałęzi jest przesuwany do przodu w drzewie zatwierdzeń. Więc wszystko, co musisz zrobić, to symulować , że:
git branch -f master dev

Zastrzeżenia: zakłada to, że master wskazuje na commit, który jest również w gałęzi dev lub innej gałęzi. Jeśli nie, ryzykujesz tracę pracę! W przeciwieństwie do git merge, które utworzy commit scalający (lub złoży skargę), gdy przewijanie do przodu nie jest możliwe, ta metodapo cichu zmusza wskaźnik gałęzi do wskazywania innego commita.

Zakłada to również, że tylko ty pracujesz nad repo i / lub wiesz, co robisz.

Wskazówka: jeśli wykonałeś git fetch i masz nowe commity w origin/master, możesz przenieść gałąź master bez sprawdzania używając:

git branch -f master origin/master

Merge przez merge commit

Nie zawsze jest to możliwe. Aby utworzyć commit scalający, musisz wykonać operację scalania. Aby wykonać operację scalania, powinieneś mieć commity w innej gałęzi, których nie ma w bieżącej gałęzi.

Jeśli masz commity w gałęzi master, które są , a nie w gałęzi dev, możesz:

Nie jest to jednak tylko dowód na to, że możliwe jest połączenie z inną gałęzią bez wymeldowuję się. Jeśli chcesz używać go codziennie, prawdopodobnie chcesz utworzyć dla niego alias za pomocą przekierowania powłoki lub zrobić dla niego skrypt powłoki. Z drugiej strony, możesz również utworzyć skrypt powłoki dla krótszego procesu pokazanego w pytaniu.

git checkout -b temp
git merge --no-ff -e master
git branch -f master temp
git checkout dev
git branch -D temp

Explanation:

  1. Sprawdź tymczasową gałąź, która wskazuje na ten sam commit co bieżąca gałąź.
  2. Połącz master z tymczasową gałęzią i uruchom edytor wiadomości commit. Jeśli chcesz Scal commit do wygląda tak, jakby połączyłeś gałąź dev do master, edytuj ją z tego:

    Merge branch 'master' into temp
    

    Do tego:

    Merge branch 'dev'
    

    Wskazówka: możesz użyć -m "Merge branch 'dev'" zamiast -e, aby być szybszym.

  3. zaktualizuje wskaźnik gałęzi master, aby wskazywał na commit merge.
  4. Zobacz oddział dev.
  5. Wymuś usunięcie tymczasowej gałęzi.
To wciąż dotyka twojego drzewa pracy, ale minimalnie tak. To nie przewraca drzewa wszystkie sposób na stan oryginału master tylko po to, aby ponownie wprowadzić zmiany w rozwoju. Niektórzy mogą się tym nie przejmować, ale dla innych może to być ważne.
 2
Author: ADTC,
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-03 04:10:55

Wiele razy przychodzisz z gałęzi, do której chcesz połączyć bieżącą gałąź. W takim razie możesz zrobić:

git co - && git merge @{-1}

Na przykład:

git checkout somebranch      // (while on master)

// add some commits

git co - && git merge @{-1}  // will merge somebranch into master
 1
Author: Tieme,
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-02-23 10:07:29