git 常用命令集

初始化

工程初始化

  • git init demo 會直接生成demo的目錄
  • mkdir demo && cd demo && git init

已追蹤文件提交修改

  1. git add -u update更新已經(jīng)追蹤的文件,到本地倉庫,相當(dāng)于git add trackedFile
  2. git commit -m "haha" 提交
  3. git push 將修改推送到服務(wù)器

新增文件提交修改

  • git add newFile
  • git add -A 添加所有已經(jīng)追蹤的文件的更改
  • git add -f .gitignore中存在也強(qiáng)行添加到暫存區(qū)
  • git add -p 可以對比work 和index 間的區(qū)別,提供給用戶對比后再提交部分確定的更新
  • git commit -m "haha"

git reset 重置一般針對暫存區(qū)操作

git reset [--soft|--hard|--mixed] <commit_id>

  • hard修改的步驟如下:
  1. 替換master(refs/master 文件所指向的commit_id)
  2. 替換暫存區(qū)的內(nèi)容
  3. 替換工作區(qū)的內(nèi)容 (這一步比較危險(xiǎn),會覆蓋工作區(qū))
  • soft 只執(zhí)行第一步操作
  • mixed 執(zhí)行 1 和 2 的操作,默認(rèn)是mixed
  • git reset 相當(dāng)于git reset --mixed HEAD . 默認(rèn)是操作所有的文件,相當(dāng)于放棄暫存區(qū)的修改
  • git reset -- filename 將filename文件的改動撤出暫存區(qū),相當(dāng)于git add filename的逆操作,雙減號只是區(qū)分commit_id 和 文件名
  • git reset HEAD filename 效果如同git reset -- filename
  • git reset HEAD^ == git reset --mixed HEAD^ 放棄上一次的git add 操作
  • git reset --hard HEAD^ 徹底放棄上一次的更改

刪除暫存區(qū)的修改

  • git rm --cache file

刪除文件

  • git rm file 該命令會刪除工作區(qū)和暫存區(qū)的文件,提交后版本庫的文件才會刪除

移動文件

  • git mv haha.txt README

例子

  • git reset --hard HEAD^ 重置到上一個(gè)老的提交分支上,該命令會破壞工作區(qū)未提交的的改動,慎用,該操作無法通過git log找回,git log 上不會保存該記錄
  • git reflog show master 可以查看到git reset --hard的修改
  • git reset --hard master@{2} 可以找回git reset --hard的修改,master@{2}通過git reflog show master 找到

git checkout 檢出,一般針對工作區(qū)操作

主要的三種用法

  • git checkout [<commit_id>] [--] <paths> 從某個(gè)commit_id 提取某個(gè)文件到當(dāng)前工作區(qū)
  • git checkout BranchName 切換分支名
  • git checkout -b NewBranch [<start_point>] 創(chuàng)建新分支

分離頭指針狀態(tài)

  • 正常情況下,HEAD 都指向分支引用的文件,如:refs/heads/master,但是如果執(zhí)行g(shù)it checkout <commit_id>就會導(dǎo)致HEAD指向特定的commit_id的情況,這種現(xiàn)象就叫做“detached HEAD”,解決辦法:git chekout -b <NewBranchName>
  • 如果沒有在出現(xiàn)頭指針的情況下,及時(shí)創(chuàng)建新分支,并且已經(jīng)做了修改并提交,此時(shí)的提交并不會記錄在之前的分支記錄上,記錄在斷頭的分支上,解決方法如下:
  1. 切換到要將該修改合并到哪個(gè)分支上: git checkout master
  2. 根據(jù)commit_id合并: git merge aacc87 commit_id 通過git log查看,斷頭模式的記錄一般保存會有個(gè)超時(shí)時(shí)間,應(yīng)盡早合并

git checkout 命令列表

  • git checkout == git checkout HEAD
  • git checkout -- filename 用暫存區(qū)中的文件替換工作區(qū)中的文件, file包含.git路徑到文件的相對路徑
  • git checkout master -- filename 用分支master中的filename覆蓋工作區(qū)和索引區(qū)的文件
  • git checkout . == git checkout -- . 用暫存區(qū)的所有文件替換工作區(qū)文件
  • git checkout HEAD . 從版本庫中獲取文件覆蓋暫存區(qū)和工作區(qū)的修改:
  • git checkout HEAD file 用版本庫的文件覆蓋暫存區(qū)和工作區(qū)
  • git checkout HEAD~1 -- haha.txt 星號相當(dāng)于向前查找某個(gè)版本
  • git checkout hello-1.x 這邊的hello1.x是遠(yuǎn)程分支的話,會創(chuàng)建和遠(yuǎn)程分支一樣分支名的本地分支,會建立和遠(yuǎn)程分支的跟蹤關(guān)系,如果是本地分支,則不會有跟蹤關(guān)系
  • git checkout --track -b hello-1.x.bak hello.1.x 建立追蹤關(guān)系,git pull 可以直接拉取更新
  • git checkout hello-1.x origin/hello-1.x 顯示創(chuàng)建和遠(yuǎn)程分支一樣名字的本地分支,會建立和遠(yuǎn)程分支的跟蹤關(guān)系

git cherry-pick <commit_id> 改變版本歷史,

git cherry-pick 應(yīng)用一些已經(jīng)存在的改變,如: A --》 B --》C --》D --》E --》F, 現(xiàn)在不要D了, 步驟如下:

  1. git checkout c 會導(dǎo)致處于detached HEAD模式
  2. 嫁接E: git cherry-pick master^
  3. 嫁接F: git cherry-pick master
  4. 斷頭模式處于為命名的分支,切換回master分支: git checkout master
  5. 用匿名分支的覆蓋當(dāng)前master分支,相當(dāng)于為master分支遷移到了剛剛的匿名分支: git reset HEAD

git rebase 變基過程

命令格式

  • git rebase --onto <NewBase> <since> <till> 變基過程不包含<since>包含<till>,命令執(zhí)行后HEAD --> till 過程如下:
  1. git checkout <till> 處于斷頭模式
  2. <since>...<till> 的提交保存到臨時(shí)文件
  3. git reset --hard <newbase>
  4. 將臨時(shí)文件的<since>...<till>從newbase節(jié)點(diǎn),逐一更改提交
  5. 若沖突則需要人工處理沖突,再決定是否變基
  6. 整個(gè)過程都在斷頭模式的匿名分支中,最后將匿名分支的修改,應(yīng)用到要實(shí)現(xiàn)變基過程的分支上:git checkout master --> git reset --hard <till>
  • git rebase --onto <NewBase> <since>
  • git rebase <since> <till>
  • git rebase <since>
  • git rebase --continue 變基過程若出現(xiàn)沖突,解決沖突(跟新到暫存區(qū),不提交),繼續(xù)執(zhí)行變基
  • git rebase --skip 跳過沖突繼續(xù)變基過程
  • git rebase --abort 回滾變基過程
  • git rebase -i <since> 交互過程,可以選擇要應(yīng)用提交,比較直觀了解。顯示的信息,是在<since>節(jié)點(diǎn)之后的所有提交,都是基于當(dāng)前分支操作,所以省去了前兩種變基過程復(fù)雜的命令參數(shù)。

之前案例的執(zhí)行過程


輔助功能

比較工具diff

  • git diff 默認(rèn)是比較work 和 index間的區(qū)別,如果執(zhí)行g(shù)it add之后,是看不到git diff比較的結(jié)果
  • git diff --cached 比較的是index 和 版本庫間的區(qū)別,只有在git add 之后,還沒commit之前能看到記錄
  • git diff HEAD 工作區(qū)和版本庫的比較
  • git diff HEAD^ HEAD [-- ./get_app_info/pipelines.py] 當(dāng)前分支前一個(gè)版本和當(dāng)前版本對比, 的某個(gè)文件, 想比較當(dāng)前版本和前一個(gè)版本的去別,當(dāng)前版本的參數(shù)放第二個(gè)位置

修改已經(jīng)提交的日志

  • git commit - -amend
  • git rebase -i <commit_id> commit_id可以通過git log查看

git stash 工作區(qū)的應(yīng)用

如果接到緊急的任務(wù),需要從一個(gè)干凈的工作區(qū)開始工作,或切換到別的分支工作,需要快速保存當(dāng)前尚未完成的工作進(jìn)度

  1. git stash == git stash save ‘message'
  2. git checkout <new_branch>
  3. 新的工作ing, 完成后
  4. git checkout <original_branch>
  5. git stash pop

命令

  • 顯示工作區(qū)列表: git stash list
  • 刪除工作區(qū): git stash drop
  • 清空工作區(qū): git stash clear
  • 基于進(jìn)度創(chuàng)建分支: git stash branch <branchName> <stash>
  • git stash apply [--index] [<stash>] 如同pop,但是不刪除stash list中的進(jìn)度信息

git push

  • 強(qiáng)推本地分支覆蓋遠(yuǎn)程分支: git push -f origin master:master

gitignore獨(dú)享式

  • git config --global core.excludesfile /home/cdz/.gitignore 設(shè)置個(gè)人獨(dú)享的gitignore文件
  • 或者在vi .git/info/execlude 創(chuàng)建文件

文件歸檔

如果用系統(tǒng)默認(rèn)的歸檔工具,可能會將.git文件夾也打包進(jìn)去

  • 基于最新的提交建立歸檔文件: git archive -o latest.zip HEAD
  • 歸檔個(gè)別目錄: git archive -o latest.tar HEAD src doc
  • 基于里程碑v1.0建立歸檔,并且為歸檔中的文件添加目錄前綴1.0: git archive --format=tar --prefix=1.0/ v1.0 | gzip > foo-1.0.tar.gz

查看相關(guān)信息命令

  • git grep "日志" 搜索版本庫文件中包含日志的行
  • 顯示版本庫.git所在的目錄: git rev-parse --git-dir
  • 顯示工作區(qū)根目錄: git rev-parse --show-toplevel
  • 顯示相對工作區(qū)根目錄的相對目錄: git rev-parse --show-prefix
  • 解析引用對應(yīng)的提交ID: git rev-parse master HEAD(head或refs/head/master)
  • 顯示精簡的修改信息: git status -s 輸出格式: index work filename
  • git cat-file commit HEAD(master 66abkhde) 用于顯示objects庫的信息
  • git show <commit_id> 用于顯示objects庫的信息
  • git ls-files --with-tree=HEAD^ ls-files 用來顯示index和work文件信息
  • git rev-list HEAD 查看本地提交列表
  • git ls-remote origin 查看遠(yuǎn)程提交列表
  • 文件追溯: git blame file 可以查看
  • git show-ref 查看引用列表,包含分支信息,tag信息,其實(shí)就是查看.git/refs文件的目錄結(jié)構(gòu),相當(dāng)于tree .git/refs

6652a0dce6a5067732c00ef0a220810a7230655e refs/heads/master
6652a0dce6a5067732c00ef0a220810a7230655e refs/remotes/origin/HEAD
6652a0dce6a5067732c00ef0a220810a7230655e refs/remotes/origin/master
c9b03a208288aebdbfe8d84aeb984952a16da3f2 refs/tags/A
1a87782f8853c6e11aacba463af04b4fa8565713 refs/tags/B

  • heads/ 存放的是分支
  • remotes/ 存放的遠(yuǎn)程分支
  • tags/存放的里程碑
  • git cherry -v origin/master~1 查找比上流分支更新的提交
  • git

git log命令

  • git log HEAD 只能查看當(dāng)前分支日志
  • git log XXX 可以查看其它分支的日志

git clean 清除工作區(qū)中未追蹤的文件,會刪除沒被追蹤的文件

  • git clean -nd 測試真正執(zhí)行g(shù)it clean命令會刪除哪些目錄
  • git clean 最好別用

磁盤空間清理

  • git fsck 查看暫存區(qū),引用游離的對象(這些游離的引用一般是有,已經(jīng)add到暫存區(qū),但是還沒提交到版本庫)
  • git prune 清除暫存區(qū)游離的對象,節(jié)省空間
  • 如果將錯(cuò)誤的文件提交到版本庫,通過 git reset --hard 回退版本 ,文件的引用還可以在reflog中找到引用,git prune無法清除,需要以下步驟才能清除:
  1. git reflog expire --expire=now --all now是一個(gè)日期,強(qiáng)制讓now之前的記錄全部過期,相當(dāng)于清空reflog
  2. git prune 清理

復(fù)制本地git版本庫

  • git clone ./demo demo1

將遠(yuǎn)程倉庫的特定分支拉到本地

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

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