2012-12-27 9 views
6

Jest to przykład tego, jak mój git repo jest teraz:Set mistrz oddziału do najnowszej tagu

v1.0 v1.1 v1.2 
    |  |  | 
    a - b - c 
    |    | 
master   HEAD 

zwykle popełnić, znacznik i wcisnąć znaczniki tak:

git commit -a -m "Commit msg" 
git tag -a v1.3 -m "Tag msg" 
git push --tags 

Głównym problemem jaki mam, jest to, że gałąź główna nie przechodzi do najnowszego tagu, więc zawsze jestem w stanie Detached HEAD. Czy istnieje sposób, aby to naprawić, aby gałąź główna zawsze wskazywała na najnowszy tag pushed?

+2

Jaki jest twój przepływ pracy? Dlaczego zawsze jesteś w oddzielnym stanie HEAD? Dlaczego nie pracujesz w oddziale? Myślę, że jest to bardziej problem z twoim przepływem pracy niż cokolwiek innego. – jszakmeister

+1

Jeśli nie zaznaczysz bezpośrednio tagu, tak się nie stanie. Wprowadź nowe zatwierdzenia dopiero po sprawdzeniu * oddziału *, nigdy * znacznika *. – cdhowie

+0

Aby móc generować pliki pakietów w repo, muszę je oznaczyć, inaczej na przykład "a3fsr2", dlatego muszę używać tagów. – Peter

Odpowiedz

7

W tym konkretnym przypadku, musiałem wykonać następujące czynności:

1) Najpierw należy ustawić oddział główny punkt do najnowszej znacznika (gdzie HEAD wskazuje), ponieważ jest najnowszy znacznik. W tym celu utworzyłem nowy oddział i połączono go z wzorcem.

git branch -b exp 
git merge -s ours master 
git checkout master 
git merge exp 

Teraz pan jest taki sam jak najnowszej tagu:

v1.0 v1.1 v1.2 
    |  |  | 
    a - b - c 
        | 
       HEAD 
        | 
       master 

2) Gdy mamy pana z powrotem na miejsce, musimy naciskać zarówno pana i znaczniki, gdy robimy nowy popełnić:

git commit -a -m "Commit msg" 
git tag -a v1.4 -m "Tag msg" 
git push master --tags 

W ten sposób unikniemy bycia w trybie Wolnej HEAD i zaktualizujemy gałąź master.

+0

Interesujące opinie, bardziej kompletne niż moja odpowiedź. +1 – VonC

+1

'git checkout -B master HEAD' wykonuje swój krok 1 bezpośrednio. – jthill

2

Oddział nie odwołuje się do znacznika.
Znacznik odwołuje się do zatwierdzonego ustalonego.

Tak długo, jak ty git checkout master, nie jesteś w detached HEAD mode.
Następnie można zatwierdzić i oznaczyć: tag zostanie utworzony w LATEST bieżącej gałęzi.

Jeśli pracowałeś w oddzielnym trybie HEAD, zapoznaj się z "Git: How can I reconcile detached HEAD with master/origin?", aby uzyskać różne sposoby uzgadniania odłączonego zatwierdzenia z odgałęzieniem.

+0

Bieżący oddział główny jest nieaktualny, więc jeśli go sprawdzę, tracę zmiany zastosowane w wersjach 1.1 i 1.2. – Peter

3

Różne odpowiedzi/komentarze już podane, dlaczego nie robić rzeczy w ten sposób, ale tutaj jest jak rozwiązać ten konkretny scenariusz:

git checkout -b tmpbranch  # creates a branch called tmpbranch at HEAD 
git checkout master    # switch back to master branch 
git merge --ff-only tmpbranch # fast-forward merge master to tmpbranch, fail if not possible 
git branch -d tmpbranch   # delete tmpbranch, it's not needed anymore 

Następnie idzie do przodu, nie sprawdzić etykietę, z wyjątkiem w ten sposób:

git checkout -b somebranch refs/tags/tagname # creates a new branch starting at tag 

ten sposób, że nie będzie w stanie jednorodzinnym głowę, a wszelkie nowe rewizje zostaną dodane zaczynając od znacznika w kwestii, która wydaje się być to, co chcesz ... Po dokonaniu commit możesz git tag newtag utworzyć dodatkowe tagi we właściwych punktach.

+0

Problem z tym rozwiązaniem polega na tym, że posiadam oddział dla każdego znacznika, który mam w repozytorium. – Peter

+0

@Peter Tylko jeśli twoje tagi znajdują się na osobnych liniach rozwoju, a nie pojawiają się w oryginalnym pytaniu. Miałbyś jedną gałąź, na przykład 'master', ze znacznikiem' v2.0' wskazującym na ostatnie zatwierdzenie w tej gałęzi i wcześniejsze znaczniki (np. 'V1.9',' v1.8' ....) do wcześniejszych zatwierdzeń w tym samym oddziale. Oddział powinien wskazywać "co będzie rodzicem kolejnego popełnienia, które popełniam". Powyższa komenda 'checkout' służy do sprawdzania starego (-owego) tagu w celu przygotowania poprawki błędu lub czegoś takiego, a nie do aktualnego rozwoju ... – twalberg