Push zatwierdza do innego oddziału

384

Czy możliwe jest zatwierdzanie i przekazywanie zmian z jednej gałęzi do drugiej.

Załóżmy, że zatwierdziłem zmiany w BRANCH1 i chcę przekazać je do BRANCH2 .

Czy z BRANCH1 można zrobić:

git push origin **BRANCH2**

A następnie zresetować BRANCH1?

jviotti
źródło

Odpowiedzi:

710

To prawie zadziała.

Podczas wypychania do gałęzi innej niż domyślna, musisz podać referencję źródłową i docelową:

git push origin branch1:branch2

Lub

git push <remote> <branch with new changes>:<branch you are pushing to> 
SLaks
źródło
26
Czy jedno branch1i drugie branch2musi znajdować się na pilocie? Co jeśli chcesz przesyłać z lokalnego branch1na zdalny origin branch2?
orad
11
@orad: Nie. Pierwsza część jest właściwie tylko identyfikatorem zatwierdzenia lokalnego; to nawet nie musi być gałąź.
SLaks,
6
@abhisekp: Użyj tej samej składni. Aby odnieść się do gałęzi źródłowej, użyj<remote>/<branch>
SLaks
4
@abhisekp: Rób dokładnie to, co właśnie powiedziałem. Obecna gałąź jest całkowicie nieistotna.
SLaks,
20
Bądź świadomy, że ktoś kusi (tak jak ja) biegać, git push origin :branch2myśląc, że po prostu wypchnie bieżącą lokalną gałąź do pilota branch2, zamiast tego usunie pilota branch2! Prawidłowy sposób to git push origin HEAD:branch2.
Helder Pereira,
72

Z pewnością będzie to działało tylko wtedy, gdy będzie przewijać do przodu BRANCH2 lub jeśli go wymusisz. Prawidłowa składnia, aby to zrobić, to

git push <remote> <source branch>:<dest branch> 

Zobacz opis „refspec” na stronie man git push, aby uzyskać więcej szczegółów na temat jego działania. Zauważ również, że zarówno wymuszone wypychanie, jak i resetowanie to operacje, które „przepisują historię” i nie powinny być podejmowane przez osoby o słabym sercu, chyba że masz absolutną pewność, że wiesz, co robisz w odniesieniu do jakichkolwiek zdalnych repozytoriów i innych ludzie, którzy mają widelce / klony tego samego projektu.

Ryan Stewart
źródło
6
Dzięki! Dodam tylko, że możesz wymusić git push --force remote local-branch:remote-branch.
Ferran Maylinch 14.04.16
16

To jest bardzo proste. Załóżmy, że dokonałeś zmian w Oddziale A, który znajduje się zarówno w lokalnie, jak i zdalnie, ale chcesz przekazać te zmiany do Oddziału B, który nigdzie nie istnieje.

Krok 01: utwórz nową gałąź B i przejdź do niej

git checkout -b B

Krok 02: Dodaj zmiany w nowym oddziale lokalnym

git add. // lub określone pliki

Krok 03: Zatwierdź zmiany

git commit -m "commit_message"

Krok-04: Przekaż zmiany do nowej gałęzi B . Poniższe polecenie utworzy również nowy oddział B zdalnie

git push origin B

Teraz można zweryfikować z bitbucket że oddział B będzie miał jeszcze jeden popełnić niż oddział A . A kiedy przejdziesz do kasy oddziału A, zmiany te nie będą dostępne, ponieważ zostały wprowadzone do gałęzi B .

Uwaga: Jeśli zatwierdziłeś swoje zmiany w gałęzi A, a następnie chcesz przenieść te zmiany do nowej gałęzi B , najpierw musisz je zresetować. #HappyLearning

Bilal Ahmed Yaseen
źródło
2

W moim przypadku miałem jedno zatwierdzenie lokalne, które nie zostało wypchnięte origin\master, ale zobowiązało się do mojego lokalnego masteroddziału. To lokalne zatwierdzenie powinno być teraz przekazane do innego oddziału.

Z Git Extensions możesz zrobić coś takiego:

  • (Utwórz, jeśli nie istnieje i) sprawdź nowy oddział, w którym chcesz przekazać swoje zatwierdzenie.
  • Wybierz zatwierdzenie z historii, która powinna zostać zatwierdzona i przekazana do tej gałęzi.
  • Kliknij prawym przyciskiem myszy i wybierz Zatwierdź wybór Cherry .
  • Prasa Cherry wybrać przycisk później.
  • Wybrane zatwierdzenie zostanie zastosowane do wyewidencjonowanego oddziału. Teraz zatwierdź i wciśnij.
  • Sprawdź swój stary oddział z wadliwym zatwierdzeniem.
  • Twardy reset tej gałęzi do drugiego ostatniego zatwierdzenia, gdzie wszystko było w porządku (pamiętaj, co tutaj robisz!). Możesz to zrobić, klikając prawym przyciskiem myszy na drugim ostatnim zatwierdzeniu i wybierając Resetuj bieżącą gałąź do tego miejsca . Potwierdź operację, jeśli wiesz, co robisz.

Możesz to również zrobić w wierszu poleceń GIT . Przykład skopiowany od Davida Christensena :

Myślę, że przekonasz się, że git cherry-pick+ git resetjest znacznie szybszym przepływem pracy:

Korzystając z tego samego scenariusza, w którym „funkcja” jest gałęzią, a najwyższe zatwierdzanie jest niepoprawne, znacznie łatwiej byłoby to zrobić:

git checkout master
git cherry-pick feature
git checkout feature
git reset --hard HEAD^

Oszczędza sporo pracy i jest scenariuszem, który git cherry-pick został zaprojektowany do obsługi.

Zauważę też, że to zadziała również, jeśli nie jest to najwyższe zatwierdzenie; wystarczy zatwierdzić argument, aby argument mógł zostać wybrany za pomocą:

git checkout master
git cherry-pick $sha1
git checkout feature
git rebase -i ... # whack the specific commit from the history

testowanie
źródło
2

Mam zły wynik git push origin branch1:branch2 polecenia:

W moim przypadku branch2został usunięty ibranch1 został zaktualizowany o kilka nowych zmian.

Dlatego jeśli chcesz, aby zmiany wprowadzane były tylko branch2od branch1, wypróbuj poniższe procedury:

  • On branch1:git add .
  • On branch1:git commit -m 'comments'
  • On branch1:git push origin branch1

  • On branch2:git pull origin branch1

  • On branch1: powrót do poprzedniego zatwierdzenia.

Benyamin Jafari
źródło
0

możesz to zrobić łatwo

git status
git add .
git commit -m "any commit"
git pull origin (branch name, master in my case)
git push origin current branch(master):branch 2(development)(in which you want to push changes)
Ramiz Khan
źródło
-1

git init 
#git remote remove origin
git remote add origin  <http://...git>
echo "This is for demo" >> README.md 
git add README.md
git commit -m "Initail Commit" 
git checkout -b branch1 
git branch --list
****add files***
git add -A
git status
git commit -m "Initial - branch1"
git push --set-upstream origin branch1
#git push origin --delete  branch1
#git branch --unset-upstream  

Srinu Mareti
źródło
1
Dodaj wyjaśnienie kodu.
Nakx
-4

Zaangażowałeś się w BRANCH1 i chcesz pozbyć się tego zatwierdzenia bez utraty zmian? git reset jest tym, czego potrzebujesz. Zrobić:

git branch BRANCH2

jeśli chcesz, aby BRANCH2 był nowym oddziałem. Możesz również połączyć to na końcu z innym oddziałem, jeśli chcesz. Jeśli BRANCH2 już istnieje, zostaw ten krok na zewnątrz.

Następnie wykonaj:

git reset --hard HEAD~3

jeśli chcesz zresetować zatwierdzenie w gałęzi, którą zatwierdziłeś. To wymaga zmian trzech ostatnich zatwierdzeń.

Następnie wykonaj następujące czynności, aby przywrócić resetowane zatwierdzenia do BRANCH2

git checkout BRANCH2

To źródło było pomocne: https://git-scm.com/docs/git-reset#git-reset-Undoacommitmakingitatopicbranch

Sasa
źródło