2012-05-25 11 views
9

Mam kilka gałęzi obiektów i oddział główny. Funkcja 2 została zakończona. Normalnie dokonałbym ponownego utworzenia bazy (praca ze zdalnym repozytorium SVN i chciałbym zachować historię, więc nie ma regularnego scalania) i ff-merge. Ale ponieważ mistrz nie zmienił się od czasu rozgałęzienia, chciałbym przenieść główkę (pod E) na G. Korzystanie z git branch -f master G nie powoduje żadnych widocznych zmian, dlatego założyłem, że jest to spowodowane tym, że G znajduje się w innej gałęzi.Przenoszenie głównej głowicy do oddziału

Czy można zamiast tego używać tutaj git update-ref -f master G? Czy powinienem trzymać się rebase/ff-merge? Coś jeszcze lepszego?

feature1  C-D 
      /
master A-B-E    
       \      
feature2  F-G 

Dziękuję.

+1

Co jest nie tak z regularnym fast-forward scaleniu z 'G' w' master'? Nie ma potrzeby zmiany nazwy. Zachowałbyś historię, a otrzymasz prosty wykres ("A-B-E-F-G"). – ellotheth

+0

Ach, oczywistość tego! wykres wygląda dokładnie tak samo jak po przebiciu. Zastanawiam się, dlaczego myślałem o czymś innym. Chcesz repostować jako odpowiedź? – kostja

+0

Funkcja branch2 ma już "prosty wykres" - wystarczy zmienić nazwę feature2 na master (lub przenieść master na feature2)! – GoZoner

Odpowiedz

5

Regularne seryjnej G do pana rade, nie ma potrzeby zmieniają bazę:

feature1  C-D 
       /
    master A-B-E    
        \      
    feature2  F-G 

git checkout master 
git merge feature2 

    feature1    C-D 
         /
    master, feature2 A-B-E-F-G 
0

Najlepiej byłoby wykonać szybkie przewijanie do przodu funkcji 2 do wzorca, używając git merge --no-ff feature2, jeśli wyewidencjonowano w gałęzi głównej. Powinieneś skończyć z następującymi:

+0

Chciałbym uniknąć regularnego łączenia się z mistrzem, gdzie to możliwe, aby zachować historię, powiedziałem to w pytaniu. I dlaczego uważasz, że nie-ff-merge jest bardziej odpowiedni niż ref move? – kostja

11

Nie musisz scalać gałęzi, wystarczy reset. Zakładając, że master jest wyewidencjonowany:

git reset --hard feature2 
+2

Reset jest funkcjonalnie równoważny szybkiemu przewijaniu do przodu w tym przypadku. – ellotheth

+1

Działa jak w reklamie, dzięki Magnus. – kostja

+0

po pięciu minutach szukania odpowiedzi, próbuję tego i to działa. proste i oczekiwane w refleksji. Dziękuję Ci! –

1

Aktualizacja-ref jest bezpieczna. Głowa oddziału jest niczym więcej niż trochę "czytaj mnie!" tag zawieszony na zatwierdzeniu. To tylko konwencja, że ​​git podnosi go i czasami zawiesza go na innym zatwierdzeniu.

Korzystanie git branch -f mistrz G nie powoduje żadnych widocznych zmian

Co git log --decorate --oneline --all powiedzieć? git show master?

+0

Mój zły, wprowadziłem niewłaściwy SHA dla 'git branch master SHA'. To zadziałało. – kostja

6

Nie jest wymagane łączenie - wystarczy zmienić nazwy oddziałów. Ponieważ nie zależy Ci na funkcji 2 ("zrobione") ani istniejącym wzorcu (w "E"), potrzebujesz następujących rzeczy.

git branch -d master 
git branch -m feature2 master 

Proste jest lepsze?

Pamiętaj, istnieją dwa kluczowe pojęcia związane:

  1. GIT popełnić wykres i
  2. GIT odwołuje

Po wykonaniu scalenia (o różnych smakach i tym rebase) Cię zmieniają wykres zatwierdzenia. Zmiany dotyczą dodania węzłów, dodania linków lub ewentualnie przeniesienia linków. Odwołania (w tym gałęzie i znaczniki) wskazują tylko na zatwierdzenia, a zatem zmiana odniesienia zmienia tylko wskazane na zatwierdzenie, a nie strukturę wykresu.

Tak więc, w twoim przypadku nie ma potrzebnych zmian w strukturze, tylko zmiana odniesień.

Wersja jedna linia:

git branch -f master feature2 

który utrzymuje feature2 oddział dookoła (w przeciwieństwie do wcześniejszego dwa-liner, które osie feature2).

+1

Dzięki, GoZoner. Dobra alternatywa, o której nie myślałem. Ale przypuszczam, że trzymam się ff-merge w moim przypadku. – kostja

+0

Zobacz dodane szczegóły w edycji. – GoZoner

+0

wydaje się działać lokalnie. Ale jak przenieść zmiany na serwer zdalny? Narzeka na nie-szybkie przewijanie do przodu – josinalvo