Część druga (tu jest część pierwsza) HOWTO nt. gita. Opisze podstawowe funkcje i tyowe komendy używane podczas pracy z repo, oraz narzędzia GUIowe do obsługi rep.

To mamy już nasze kochane repo. Nieważne czy jest to nasz własny projekt, czy developujemy już jakiś istniejący projekt. Załóżmy dla przykładu że chcemy napisać patcha do jakiegoś opensourcowego projektu. Zaczynamy więc od sklonowania repo, następnie tworzymy gałąź, która potem użyjemy do zrobienia diffa z masterem i wygenerowania patcha.

$ git clone git://some.repo/some_project.git
$ git branch uberpatch
$ git branch
master
* uberpatch

Widzimy że są 2 gałęzie i jesteśmy w gałęzi uberpatch. Czas zacząć pisać kod ;]. Po skończeniu dajemy

$ git add configwatch.pl
$ git commit
[uberpatch bfacadb] comment cleanup
1 files changed, 0 insertions(+), 2 deletions(-)

można też użyć -a w commicie, doda to wszystkie śledzone i zmienione pliki, ale żeby dodać nowy plik do projektu trzeba użyć add.  Teraz tworzenie patchu. Wypadałoby żeby patch był zrobiony na podstawie aktualniej wesji repo, więc przełączamy się na mastera i ściagamy ew. aktualizacje

$ git checkout master
$ git pull
$ git branch
* master
uberpatch

Teraz czas żeby wygenerowac diffa. Dajemy po prostu

$ git diff master uberpatch
diff --git a/configwatch.pl b/configwatch.pl
index 019fc32..33fdfdb 100755
--- a/configwatch.pl
+++ b/configwatch.pl
@@ -13,8 +13,6 @@ my $db = new Thread::Queue;


new Thread \&log, $log;
new Thread \&diff, $db, $diff, $notify;
-
-#new Thread \&notify, $notify;
new Thread \&db_save, $db;
new Thread \&rss;


@@ -24,8 +22,6 @@ foreach (@ARGV) {
}


while (1) {
-
- # By default this will block until something is read
my @events = $inotify->read();
if ( scalar(@events) == 0 ) {
print "read error: $!";
@@ -50,7 +46,6 @@ while (1) {
}
$diff->enqueue( \%a );
$log->enqueue( \%a );
-
}
}

I mamy patch ;].

Dobra, ale co jak mamy własne repo ? Ano kroki są podobne, tylko zamiast diffa wpychamy zmiany na master server

$ git push
warning: You did not specify any refspecs to push, and the current remote
warning: has not configured any push refspecs. The default action in this
warning: case is to push all matching refspecs, that is, all branches
warning: that exist both locally and remotely will be updated. This may
warning: not necessarily be what you want to happen.
warning:
warning: You can specify what action you want to take in this case, and
warning: avoid seeing this message again, by configuring 'push.default' to:
warning: 'nothing' : Do not push anything
warning: 'matching' : Push all matching branches (default)
warning: 'tracking' : Push the current branch to whatever it is tracking
warning: 'current' : Push the current branch
Everything up-to-date

He? Wuts that ? Git po prostu nam mówi że domyśnie wrzuci wszystkie gałęzie które istnieja zarówno lokalnie jak i zdalnie. Nie przepadam za domyślnym zachowaniem (bo np. po stowrzeniu nowej gałęzi nie wyśle jej automatycznie) więc ustawie domyślną na “current” (czyli wyślij gałąź w której jestem aktualnie)

$ git config push.default current
$ git push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 562 bytes, done.
Total 6 (delta 4), reused 0 (delta 0)
To ssh://git@devrandom.pl/configwatch.git
* [new branch] HEAD -> uberpatch

Jak widać właśnie wysłałem nową gałąź do serwera. Dobra, skończyłem pracę nad tą gałęzią i chce ją wrzucić spowrotem do mastera. Robię więc:

$ git checkout master
$ git merge uberpatch
Updating f52c581..37450ad
error: Entry 'configwatch.pl' not uptodate. Cannot merge.

Eep! Coś się źle mergnęło. Zaglądam więc co poszło nie tak przez, poprawiam błędy i commituje

$ git diff
diff --git a/configwatch.pl b/configwatch.pl
index 019fc32..065fccf 100755
--- a/configwatch.pl
+++ b/configwatch.pl
@@ -14,7 +14,7 @@ my $db = new Thread::Queue;
new Thread \&log, $log;
new Thread \&diff, $db, $diff, $notify;


-#new Thread \&notify, $notify;
+new Thread \&notify, $notify;
new Thread \&db_save, $db;
new Thread \&rss;
$ emacs configwatch.pl
$ git add configwatch.pl
$ git commit

Gałąż uberpatch nie jest mi już potrzebna więc:

$ git branch -d uberpatch
$ git push
Counting objects: 10, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 663 bytes, done.
Total 6 (delta 4), reused 0 (delta 0)
To ssh://git@devrandom.pl/configwatch.git
f52c581..6addf28 HEAD -> master

Dobra, fajnie, da sie używać, tylko pomyliłem się w commicie i co dalej ? Zrobić nowy i wpisać w komentarzu że to poprawki do starego ? Ano nie, wystarczy “zmienić na dobrze”, porobić gid add tego co trzeba i

$ git commit --amend

Spowoduje to “zmianę” ostatniego commita na to co przed chwilą poprawiliście. Byleby zrobić to przed pushem bo jeżeli nie to już trzeba będzie troche się pobawić. Już nie mówiąc o tym że ktoś może ściągnąć “zły” commit zanim go poprawicie

Related Posts: