git高級命令

記錄平時使用的但不是很容易記住的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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容