Git

http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

Új, független ág létrehozása

http://book.git-scm.com/5_creating_new_empty_branches.html

git symbolic-ref HEAD 'refs/heads/newbranch' rm '.git/index' git clean -fdx git commit --allow-empty -m 'Initial commit'

Minden változás lekérése a remote-okról

git fetch --all --prune --tags
--all	minden remote használata
--prune	a távol törölt branch-ek törlése helyileg
--tags	a távol változott tag-ek lekövetése helyileg

Minden változás feltöltése a remote-ra

git push origin --all git push origin --tags
--all	minden referencia feltöltése
--tags	minden tag feltöltése / frissítése
A --all nem foglalja magába a --tags-et!

Remote törlése az összes branch-ével együtt

git remote rm 'origin-foo'
Ez a parancs csak a referenciákat távolítja el, így érdemes a nem elérhető objektumok kézzel törölni. lásd lentebb

Tag törlése

Helyileg:

git tag -d 12345

Távol:

git push origin :refs/tags/12345

Rendszeresen előforduló conflict-ok feloldása

git config --local rerere.enabled true git config --local rerere.autoupdate true

Fájlok más helyre mozgatása egy másik repóba a history megtartásával

http://stackoverflow.com/questions/1365541/how-to-move-files-from-one-git-repo-to-another-not-a-clone-preserving-history

Patchek kigyűjtése:

git log 'from-patch..to-patch' --pretty=email --patch-with-stat --reverse './wanted-folder-and-subfolders' > 'patches'

Patch-ben lévő elérési útvonalak módosítása

Módosított patch alkalmazása a másik repón:

git am -3 < 'patches'

Karbantartás, takarítás

http://stackoverflow.com/a/28335092/1108919

Nem elérhető objektumok törlése

git reflog expire --expire=now --all git gc --aggressive --prune=now

Félbehagyott műveletek megszakítása

git cherry-pick --abort git am --abort git merge --abort git rebase --abort

Lokális változások törlése

git reset --hard git clean -fd

Helyreállítás

Elkevert patch-ek visszaszerzése

Elkevert patch-ek:

git lost-found gitk $(cd '.git/lost-found/commit' && echo ??*)

Szükséges patch-ek megjelölése (pl: tag-eléssel, vagy branch létrehozással)

Repó sérülés

http://stackoverflow.com/questions/801577/how-to-recover-git-objects-damaged-by-hard-disk-failure

Git beszerzése

Statikus Git

http://en.newinstance.it/2011/02/27/how-to-create-a-statically-linked-version-of-git-binaries/

# let's make sure we have all we need to proceed sudo apt-get install libexpat1-dev asciidoc libz-dev gettext curl # let's create the directory to host the built artifacts sudo mkdir /opt/git-1.7.4.1-static # we are ready to download and unpack latest version of git sources (last: http://git-scm.com/) curl http://kernel.org/pub/software/scm/git/git-1.7.4.1.tar.bz2 | tar xvj cd git-1.7.4.1/ # then compile and install the files in the target directory we created ./configure --prefix=/opt/git-1.7.4.1-static CFLAGS="${CFLAGS} -static" NO_OPENSSL=1 NO_CURL=1 sudo make install sudo make install-doc

SVN to Git

Git repó inicializálása:

git init

SVN felhasználónév <=> Git committer egyeztetése a C:\Users\foo\Desktop\users.txt fájlban (kis-, nagybetű érzékeny!):

foobar = Foo Bar <foo.barm@gmail.com> Fooar = Foo Bar <foo.barm@gmail.com> FooBar = Foo Bar <foo.barm@gmail.com> APPLETREE = Apple Tree <applet@gmail.com>

Git config:

[core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true hideDotFiles = dotGitOnly [svn-remote "svn"] noMetadata = 1 url = http://localhost:2080/svn/Devel/MAINLINE fetch = :refs/remotes/git-svn [svn] pathnameencoding = iso-8859-2 authorsfile = d:/Users/foo/Repositories/git/users.txt
git svn init 'http://localhost:2080/svn/Devel/MAINLINE' --no-metadata git svn init 'http://localhost:2080/svn/Test' --no-metadata git config svn.authorsfile '/c/Users/foo/Desktop/users.txt' git config svn.pathnameencoding 'cp1252' # Linuxon ne állítsd be! git svn fetch rm -r '.git/svn' '.git/refs/remotes/git-svn'

Meta infók lecserélése

git filter-branch --env-filter ' # bash kód a környezeti változók lecserélésére ' HEAD

Módosítható értékek

GIT_AUTHOR_NAME

GIT_AUTHOR_EMAIL

GIT_AUTHOR_DATE

GIT_COMMITTER_NAME

GIT_COMMITTER_EMAIL

GIT_COMMITTER_DATE

man git-filter-branch

Egyéb egyéb elérhető változók

GIT_COMMIT

GIT_DIR

GIT_INDEX_FILE

GIT_OBJECT_DIRECTORY

GIT_QUIET

GIT_WORK_TREE

Régi author és committer lecserélése

http://serverfault.com/questions/12373/how-do-i-edit-gits-history-to-correct-an-incorrect-email-address-name/13162#13162

git filter-branch --tag-name-filter 'cat' --env-filter ' oldname="FooBarZ" oldemail="foobarz@dummy.com" newname="Foo Bar" newemail="foo@bar.com" [ "$GIT_AUTHOR_NAME" == "$oldname" ] && GIT_AUTHOR_NAME="$newname" [ "$GIT_AUTHOR_EMAIL" == "$oldemail" ] && GIT_AUTHOR_EMAIL="$newemail" [ "$GIT_COMMITTER_NAME" == "$oldname" ] && GIT_COMMITTER_NAME="$newname" [ "$GIT_COMMITTER_EMAIL" == "$oldemail" ] && GIT_COMMITTER_EMAIL="$newemail" ' -- --all

Branch átemelése egy másik repóból

http://stackoverflow.com/a/17864475/1108919

Álljunk a célrepóba, majd adjuk meg a forrás repó helyét és az átemelni kívánt branch-et:

git pull '../forras-repo' master

Rebase a legelső patchel együtt

http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git/2309391#2309391

git rebase --root ...

"original" referenciák törlése

az „official way”:

git for-each-ref --format='%(refname)' refs/original/ | xargs -n 1 git update-ref -d

egyszerűbben:

rm -rf '.git/refs/original'

Elérési út manipulációk

https://git-scm.com/docs/git-filter-branch

Ha nem szeretnénk, hogy a git megjegyezze az eredeti állapotot is, használjuk a --force kapcsolót.

Könyvtár kiemelése egy új branch-re

https://makingsoftware.wordpress.com/2013/02/16/using-git-subtrees-for-repository-separation/

git subtree split --prefix='path/of/code' -b 'destination-branch'

Elérési út prefixelése

export path_prefix='foo' git filter-branch --tag-name-filter 'cat' --index-filter ' git ls-files -s | sed "s>\t\"*>&'"${path_prefix}"'/>" | GIT_INDEX_FILE="${GIT_INDEX_FILE}.new" git update-index --index-info && mv "${GIT_INDEX_FILE}.new" "${GIT_INDEX_FILE}" ' -- --all

Könyvtár kiemelése egy új branch-re

git subtree split --prefix='path/of/code' -b 'destination-branch'

Tetszőleges fájlművelet minden branch-re

Pl. az összes fájl és mappa mozgatása egy újonnan létrehozott web könyvtárba:

git filter-branch --tree-filter ' mkdir -p web for fso in $(ls -A | grep -Ev '"'"'^(web|\.git)$'"'"') do new="web/$(echo "${fso}" | sed '"'"'s>^poc->>'"'"')" echo "# $fso >> $new" mv "$fso" "$new" done ' -- --all

Távoli változás ellenőrzése

local_commit="`git rev-parse HEAD`" remote_commit="`git rev-parse @{u}`" if [ "${local_commit}" == "${remote_commit}" ]; then echo "No changed" fi

Fixup patch darabolása

git add -A && git absorb -b origin/master --force