Praca z GIT - merge

tj4java
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 3 lata
  • Postów:39
0

Takie techniczne dość pytanie mam do doświadczonych programistów z GITem.
Jeśli tworzymy sobie swój własny branch na nową funkcjonalność, po czym zatrzymamy ten rozwój, zmieniamy w tym czasie wiele (mergując inne branche na masterze) i powrócimy do wcześniej wspomnianego, wstrzymanego brancha to aby mieć najświeższy stan na swoim branchu mergując go z tym co jest na masterze popełniamy błąd? Czy powinniśmy jednak pracować ze stanem na masterze z okresu rozpoczęcia pracy nad nową funkcjonalnością (utworzenie branch), a dopiero potem łączyć wszystkie zmiany? Mi wydawało się dość wygodne, by zaciągać do swojego brancha zmiany z master i dopiero potem je zmergować jak zakończę pracę w tym swoim branchu. Jak najlepiej więc pracować w takim przypadku?

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
10

IMO najwygodniejszy w takiej sytuacji jest rebase; staram się unikać mergów, które nie są fast-forward (ponieważ komplikują historię).


edytowany 1x, ostatnio: Patryk27
SH
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Poznań
  • Postów:109
5

IMO najlepiej jeśli branch jest x commitów za masterem, to zrobić rebase tego brancha. Wtedy wskaźnik brancha się przesuwa do aktualnego mastera, rozwiązujemy konflikty lub nie i albo możemy to zmergować albo pracować sobie dalej na branchu z tym, że z aktualnymi źródłami.

EDIT:
Ahh 17 sekund szybszy :D

edytowany 3x, ostatnio: Soul_hunter_16
tj4java
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 3 lata
  • Postów:39
1

Dziękuję, myślę że to będzie dla mnie pomocne.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Wrocław
2

Ja jak pracuję długo nad jakimś ficzerem, to też zaciągam zmiany z mastera w miarę na bieżąco. Prościej rozwiązywać mało konfliktów na raz, niż potem dużo przy wielkim merge ficzera do mastera.
Rebase jest w ogóle nieprzydatny do pracy na poziomie master <-> ficzer i ma sens jedynie na lokalnych gałęziach.

Zobacz pozostałe 4 komentarze
somekind
Rebasuję wtedy, gdy commity z jednej gałęzi chcę mieć w innym, bo mi pasują do taska. To operacja na dwóch lokalnych gałęziach. Żeby zachować czytelność w master nie mogę rebasować, bo wtedy właśnie czytelność stracę.
Anna Lisik
@somekind: właśnie aby sterować czytelnością został opracowany parametr depth :) no chyba że używasz jakiegoś UI do gita.....
somekind
Nie ma znaczenia czego używam, skoro to chyba jakiś magiczny parametr, o którym nie wiedzą nawet twórcy gita, bo w dokumentacji go nie ma.
somekind
To, że mogę sobie sklonować tylko kawałek repozytorium, to wiem. Ale nadal nie wiem jaki to ma związek z rebase.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 6 godzin
1

ponieważ komplikują historię

A na co komu liniowa historia?

rebase'ami tylko denerwujemy innych którzy chcą coś zrobić lub choćby zobaczyć na tej samej branczy.
a jeszcze gorzej gdy ktoś od takiej odbije swoją…

edytowany 2x, ostatnio: Azarien
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
2

A na co komu liniowa historia?

Aby odpowiedzieć na to pytanie, powinniśmy najpierw zadać inne: dla kogo przeznaczona jest historia systemu kontroli wersji?

W moim przypadku odpowiedź brzmi dla innych ludzi, stąd przed ostatecznym mergem wykonuję rebase, fixup oraz inne porządkujące czynności :-)

a jeszcze gorzej gdy ktoś od takiej odbije swoją…

Jeśli wszyscy są świadomi tego, że drużyna wykorzystuje rebase, nie stanowi to żadnej przeszkody.


edytowany 2x, ostatnio: Patryk27
Azarien
no właśnie, dla innych, więc wolę żeby historię widzieli prawdziwą a nie upiększoną zakłamaną :D
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
2

Reabse wolo robić tylko jeśli wybrany branch jest tylko mój.
Jeśli ktoś inny też używa tego brancha to trzeba się z nim dogadać, albo robić zwykły merge.

Ja lubię rebase i/albo squash bo: rozumiem co się dzieje i nie cierpię szerokiej historii. Nie zmuszam nikogo do tej praktyki. Ważniejsze, żeby osoba robiąca merge, wiedziała co robi i czuła się pewnie.
Dlatego ja ci mówię rób tak jak umiesz. Nie ważne jak dostarczysz kod, ważne, żeby poprawnie działało i spełniało wszystkie wymagania projektu (te biznesowe jak i coding convention). Jak nabierzesz większej wprawy to przyjdzie czas korzystania z bardziej zakręconych funkcji git-a.

Jeśli kod jest pisany z głową i z przestrzeganiem Single Responsibility Principle to konflikty są ma małe i proste w naprawieniu.
Niestety dla większości SRP to tylko fajne pytanie podczas rekrutacji.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Wrocław
0
Patryk27 napisał(a):

W moim przypadku odpowiedź brzmi dla innych ludzi, stąd przed ostatecznym mergem wykonuję rebase, fixup oraz inne porządkujące czynności :-)

Tylko po co, skoro prościej i szybciej można zrobić merge ze squashem?
A rebase z zostawieniem historii swoich śmieciowych lokalnych commitów w masterze, to jest zbrodnia na czytelności.

edytowany 1x, ostatnio: somekind
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

skoro prościej i szybciej można zrobić merge ze squashem?

Zależy - nie zawsze chcesz / chcę wrzucić branch tak, jak gdyby był jednym, całym commitem.

A rebase z zostawieniem historii swoich śmieciowych lokalnych commitów w masterze, to jest zbrodnia na czytelności.

Ano, nie zaprzeczam.


edytowany 1x, ostatnio: Patryk27
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Wrocław
1
Patryk27 napisał(a):

Zależy - nie zawsze chcesz / chcę wrzucić branch tak, jak gdyby był jednym, całym commitem.

No może Ty nie zawsze. Bo ja zawsze, dla mnie jeden task = jeden wpis w historii.

Zobacz pozostałe 5 komentarzy
somekind
Zakładam, że to potwierdzenie. A więc to jest dopiero horror, w takiej historii nie da się niczego znaleźć, a co dopiero release notesu wygenerować.
Azarien
Co wchodzi do release'u jest na Jirze, tam są user story i epiki. Lista commitów nie jest do tego potrzebna.
somekind
Jest potrzebna do stwierdzenia, którego tasku dotyczy ta zmiana.
Azarien
to widać po nazwie branchy (która pojawia się też w merge'ach)
Anna Lisik
@Azarien: Co prawda lista commitów nie jest potrzebna do generacji RN, ale jest bardzo przydatna....
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 6 godzin
1
somekind napisał(a):
Patryk27 napisał(a):

Zależy - nie zawsze chcesz / chcę wrzucić branch tak, jak gdyby był jednym, całym commitem.

No może Ty nie zawsze. Bo ja zawsze, dla mnie jeden task = jeden wpis w historii.

Commity robię małe. Jedno, kilkulinijkowe. Nie wyobrażam sobie żebym miał tyle tasków.
Ani wielkich commitozaurów na tysiąc linii które robią zylion rzeczy na raz.

Zobacz pozostałe 6 komentarzy
Azarien
po pierwsze te PRki mogą być do różnych branczy, więc i tak muszą być osobne, a po drugie to rzadko jednego dnia mam więcej niż trzy, a często przez kilka dni nie wystawiam żadnej.
KamilAdam
Ja jednego taska robię tydzień więc mam dwa PRy na sprint :D
Anna Lisik
@Kamil Żabiński: +1
Anna Lisik
@Azarien: Nie. Pracuję na jednym branchu. Nie pracuje na kilku naraz bo to prowadzi do (czasami bardzo) dziwnych sytuacji i problemów typu zabrudzenie PH a to jest wysoce niepożądane u nas
Azarien
Brancze są ficzerowe i nie mam na to wpływu że task dotyczący ficzera A trzeba robić na branczy od ficzera A a task dotyczący ficzera B trzeba robić na branczy od ficzera B. nie wiem co to jest PH.
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Bo ja zawsze, dla mnie jeden task = jeden wpis w historii.

Przy okazji robienia zadań staram się porządkować ruszane przeze mnie pliki - wszystkie takie refactoring-like zmiany idą do osobnego commitu, aby nie stwarzały szumu w trakcie CR. Plus pojedynczy mały commit łatwiej jest cofnąć niż taki ogromny.

Choć zależy to ofc. od drużyny - mi pasuje taki flow, komuś innemu inny, a ktoś inny jeszcze zasugeruje trunk-based development.


edytowany 3x, ostatnio: Patryk27
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Wrocław
1
Azarien napisał(a):

Commity robię małe. Jedno, kilkulinijkowe. Nie wyobrażam sobie żebym miał tyle tasków.

Ja robię nawet półlinijkowe. Na swoim feature-branchu oczywiście. Bo wbijanie tych dziesiątek commitów do mastera nie ma najmniejszego sensu, dlatego robię merge ze squashem i w masterze jeden task to jeden commit.

Patryk27 napisał(a):

Przy okazji robienia zadań staram się porządkować ruszane przeze mnie pliki - wszystkie takie refactoring-like zmiany idą do osobnego commitu, aby nie stwarzały szumu w trakcie CR. Plus pojedynczy mały commit łatwiej jest cofnąć niż taki ogromny.

Tu jakby nie widzę sprzeczności, po prostu refactoring to powinien być oddzielny task.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 6 godzin
0

Commity robię małe. Jedno, kilkulinijkowe. Nie wyobrażam sobie żebym miał tyle tasków.

Ja robię nawet półlinijkowe. Na swoim feature-branchu oczywiście. Bo wbijanie tych dziesiątek commitów do mastera nie ma najmniejszego sensu

Nigdzie nie mówiłem o masterze. Na braczę ficzerową, nad którą zwykle pracuje kilka osób, więc małe i częste commity sprzyjają współpracy.

Kiedyś potem jest robiony merge do mastera i nikogo nie obchodzi czy to jest 1 commit czy 200.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Wrocław
2
Azarien napisał(a):

Nigdzie nie mówiłem o masterze.

Ale ja mówiłem. Więc jeśli Ty w odpowiedzi na to, co ja mówię, zaczynasz mówić o czymś innym, to nie widzę w tym zbyt wiele sensu.

Kiedyś potem jest robiony merge do mastera i nikogo nie obchodzi czy to jest 1 commit czy 200.

No ok, u Was się tak pracuje. Ja pracuje z ludźmi, którzy nie lubią bałaganu, ja też nie, więc w masterze staramy się mieć jeden commit per task. Nikomu historia pracy nad konkretnym taskiem nie jest potrzebna po jego ukończeniu.

NN
NN
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 4 lata
  • Postów:239
0

rebase'ami tylko denerwujemy innych którzy chcą coś zrobić lub choćby zobaczyć na tej samej branczy.
a jeszcze gorzej gdy ktoś od takiej odbije swoją…

Jak masz 80 commitów na branchu to też?

Azarien
Jak już napisałem, ilość commitów nie jest problemem. Jak jest ich 200 to też.
NN
NN
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 4 lata
  • Postów:239
1

Warto jeszcze używać tej opcji przy pracy lokalnej https://git-scm.com/docs/git-rerere zwłaszcza jak się robi dużo commitów

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)