Git
Új, független ág létrehozása
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
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
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
Git beszerzése
Statikus Git
# 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!):
- users.txt
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:
- .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'
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
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
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
Á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
"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
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
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