初始化
工程初始化
- git init demo 會直接生成demo的目錄
- mkdir demo && cd demo && git init
已追蹤文件提交修改
- git add -u update更新已經(jīng)追蹤的文件,到本地倉庫,相當(dāng)于git add trackedFile
- git commit -m "haha" 提交
- 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修改的步驟如下:
- 替換master(refs/master 文件所指向的commit_id)
- 替換暫存區(qū)的內(nèi)容
- 替換工作區(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í)的提交并不會記錄在之前的分支記錄上,記錄在斷頭的分支上,解決方法如下:
- 切換到要將該修改合并到哪個(gè)分支上: git checkout master
- 根據(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了, 步驟如下:
- git checkout c 會導(dǎo)致處于detached HEAD模式
- 嫁接E: git cherry-pick master^
- 嫁接F: git cherry-pick master
- 斷頭模式處于為命名的分支,切換回master分支: git checkout master
- 用匿名分支的覆蓋當(dāng)前master分支,相當(dāng)于為master分支遷移到了剛剛的匿名分支: git reset HEAD
git rebase 變基過程
命令格式
- git rebase --onto <NewBase> <since> <till> 變基過程不包含<since>包含<till>,命令執(zhí)行后HEAD --> till 過程如下:
- git checkout <till> 處于斷頭模式
- <since>...<till> 的提交保存到臨時(shí)文件
- git reset --hard <newbase>
- 將臨時(shí)文件的<since>...<till>從newbase節(jié)點(diǎn),逐一更改提交
- 若沖突則需要人工處理沖突,再決定是否變基
- 整個(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)度
- git stash == git stash save ‘message'
- git checkout <new_branch>
- 新的工作ing, 完成后
- git checkout <original_branch>
- 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無法清除,需要以下步驟才能清除:
- git reflog expire --expire=now --all now是一個(gè)日期,強(qiáng)制讓now之前的記錄全部過期,相當(dāng)于清空reflog
- git prune 清理
復(fù)制本地git版本庫
- git clone ./demo demo1
將遠(yuǎn)程倉庫的特定分支拉到本地
- git pull origin master