記錄平時使用的但不是很容易記住的git操作。
打上含有注釋的tag
git tag -a "{tagname}" -m "tag description"
推送和刪除遠(yuǎn)程倉庫的tag
// 推送
git push origin tag {tagname}
// 刪除
git push origin -d tag {tagname}
刪除已提交到遠(yuǎn)程倉庫的記錄
// 回滾到最近一次的記錄
git reset --hard HEAD^
// 回滾到最近2次的記錄
git reset --hard HEAD~2
// 回滾到指定記錄
git reset --hard {commitId}
// 回滾之后,強(qiáng)制提交到遠(yuǎn)程倉庫
git push origin HEAD --force
強(qiáng)制回滾到某一次記錄后(上一條的 git reset --hard),發(fā)現(xiàn)回滾錯了,但此時log記錄里已經(jīng)找不到這個之前的記錄了,該如何找回呢?
可以在.git/logs/HEAD,或者某一個分支下,比如.git/logs/refs/heads/develop,找到這條log記錄

image.png
再執(zhí)行
git reset --hard log 即可。
刪除尚未提交的文件(Untracked files)
// 文件
git clean -f
// 目錄
git clean -fd
// 添加-n選項可以查看要刪除的文件列表
[~] git clean -nf
Would remove temp1.txt
Would remove temp2.txt
丟棄對某個文件的修改
git checkout -- {filename}
git統(tǒng)計提交次數(shù)排在前五名的作者
[~] git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5
105 author1
40 author2
3 author3
git統(tǒng)計某個作者的代碼量
git log --author="mr_franklin" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'
added lines: 10107, removed lines: 7146, total lines: 2961
git統(tǒng)計所有人的代碼量(可指定起止時間)
git log --since=2013-08-01 --until=2023-09-07 --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
忽略新添加到 .gitignore,但之前提交過的文件。 (默認(rèn)情況下,如果之前提交過,即使添加到.gitignore里,也會被提交)。
git rm —cached logs/
徹底刪除遠(yuǎn)程倉庫內(nèi)的文件,包括log
// your-filename是要刪除的文件
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch your-filename -r' \
--prune-empty --tag-name-filter cat -- --all
git push origin --force --all
查看某個文件的更改記錄
git log --p filename
// 之后選擇對應(yīng)的版本號,查看修改內(nèi)容
git show versionNo
如何提交一個空目錄?
git默認(rèn)情況下不會提交一個空目錄,可以在該目錄下創(chuàng)建一個名為.gitkeep的文件,之后該目錄就可以被順利的提交了。
注意.gitkeep并非是git官方標(biāo)準(zhǔn),它可以是任何名字,it's just a trick!
git clone最新的或者某一個版本的代碼
git clone命令默認(rèn)會將所有commit過的代碼都下載下來,但有時候我們只想clone某一個穩(wěn)定版本的代碼,不關(guān)心之前的commit記錄,可以用下面的命令:
// clone 分支名為branch-id的代碼, --depth=1 表示只clone最新一次的提交
git clone --depth 1 http://git-path.git -b branch-id
這么做還有一個好處是能顯著提高下載速度,對于clone代碼量比較大的項目尤其好用。
將原有倉庫的所有代碼(包括所有分支和tag)推送到新的倉庫
cd existing_repo
git remote rename origin old-origin
git remote add origin ssh://git@gitlab.com/code.git
git push -u origin --all
git push -u origin --tags
合并一個倉庫的代碼到另一個倉庫,常用于fork出一個倉庫后,同步原始倉庫的新代碼
// 拉取源倉庫的代碼
git fetch old-origin master
// checkout到現(xiàn)有倉庫的指定分支
git checkout master
// 合并代碼
git merge old-origin/master
// 推送至當(dāng)前倉庫,如果之前origin倉庫的master分支和本地分支做了關(guān)聯(lián),方括號內(nèi)容可以不敲
git push [origin mater]
查看短hash值(short commit id)
git rev-parse --short HEAD
為每個不同項目設(shè)置username和email
如果沒有顯式設(shè)置,默認(rèn)使用global配置。
在當(dāng)前項目下執(zhí)行:
git config user.name xxx
git config user.email xxxxx@xx.com
修改已經(jīng)commit的comment
git commit --ament