使用git進(jìn)行版本管理(不斷更新中)

使用git進(jìn)行版本管理

常識(shí)

  • 文件的幾個(gè)狀態(tài):Untracked,Unmodified(已修改,此時(shí)文件在工作目錄),Modified(已暫存,此時(shí)文件在暫存區(qū)),Staged(已提交,此時(shí)文件在版本倉庫)
  • 在終端使用git 命令,需要幫助可以直接在命令后面加 -h,便可以查看命令的使用說明

文檔狀態(tài):基本內(nèi)容完成,處于細(xì)節(jié)調(diào)整中。

<a name="MljPM"></a>

一、git基礎(chǔ)操作

<a name="zurBZ"></a>

開始使用

<a name="EhFLr"></a>

git的基礎(chǔ)配置

git的基礎(chǔ)配置分為三個(gè)作用域

  • local:只對(duì)當(dāng)前的長(zhǎng)褲有效
  • global:對(duì)登錄用戶的所有倉庫有效
  • system:對(duì)系統(tǒng)的所有用戶有效

config的優(yōu)先級(jí):local>global>system

git config --global user.name 'name'
git config --global user.email 'email@email'

# 顯示git config的配置
git config --list --local
git config --list --global
git config --list --system

git config --local user.name # 僅查看user.name

# 設(shè)置,缺省等同于local
git config --local 
git config --global
git config --system

# 清除
git config --unset --local user.name
git config --unset --global user.name
git config --unset --system user.name


# git編輯器默認(rèn)使用shell環(huán)境變量$EDITOR所指定的軟件。一般vim/emacs,可以使用下面命令將終端下的默認(rèn)編輯器更改為vim,
git config --global core.editor vim 

<a name="67Zk9"></a>

初始化git倉庫

# 已有項(xiàng)目代碼,進(jìn)入到項(xiàng)目的根目錄,在當(dāng)前目錄下創(chuàng)建git倉庫
git init

# 無項(xiàng)目代碼
cd 某個(gè)文件夾
git init project # 在當(dāng)前目錄下創(chuàng)建和項(xiàng)目名稱同名的文件夾
cd project

<a name="2daxB"></a>

忽略某些文件

在項(xiàng)目?jī)?nèi),有些文件,比如常見的第三方依賴,或者是構(gòu)建后生成的文件,他們可以通過安裝或者構(gòu)建得到,對(duì)于這些文件,我們通常不將其列入我們的版本倉庫,這可以通過在項(xiàng)目的根目錄下添加.gitignore文件來實(shí)現(xiàn)。文件內(nèi)容如下。

doc 將不會(huì)管理doc文件夾內(nèi)的所有內(nèi)容,也不管doc文件
doc/ 只不管doc文件夾內(nèi)的文件

# 對(duì)于前端項(xiàng)目通常會(huì)添加如下的內(nèi)容
.DS_Store
node_modules/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
/test/unit/coverage/
/test/e2e/reports/
selenium-debug.log

我們?cè)谑褂媚承㊣DE時(shí)通常會(huì)有插件可以幫助我們更加快捷的添加gitignore。比如Jetbrains就可以通過插件很方便的添加gitignore

<a name="llpMN"></a>

git別名

git 為了方便我們的使用,可以對(duì)常用的命令起別名,從而提升終端的使用效率

git config --global alias.co checkout
git config --global alias.unstage 'reset HEAD --'
git config --global alias.visual '!gitk'
        執(zhí)行外部命令 + !

<a name="TEqOr"></a>

Git的工作流程

  1. 在目錄中添加、修改文件
  2. 將需要進(jìn)行版本管理的文件放入暫存區(qū)域
  3. 將暫存區(qū)域的文件提交到Git倉庫
    <a name="2AW2s"></a>

<a name="feqvU"></a>

將文件添加到暫存區(qū)

git add . # 跟蹤當(dāng)前目錄下的所有文件
git add fileA fileB #跟蹤fileA和fileB文件
git add -u # 將所有已跟蹤文件的變更添加到暫存區(qū)

<a name="S73WU"></a>

將暫存區(qū)內(nèi)容提交至git倉庫

提交得commit message要盡可能得有意義,便于我們了解此次變更做了什么。否則這會(huì)其他人造成困擾,也會(huì)給我們得某些操作造成困擾,比如無法通過git reflog,知道我們得每個(gè)git操作具體做了什么

git commit

git commit -m 'message'

git commit -a -m 'message' 或 git commit -am 'message' 對(duì)于在工作區(qū)內(nèi)新增加還未追蹤的文件不生效。

git commit --amend //追加提交,在不增加新的commit-id的情況下,將新修改的代碼追加到前一次commit-id中

git commit --help

<a name="oE4FV"></a>

打標(biāo)簽

git 打標(biāo)簽,針對(duì)的是一個(gè)commit。打標(biāo)簽一般是伴隨著發(fā)版進(jìn)行的,通過git標(biāo)簽,我們可以更加方便的進(jìn)行版本查看和回退等操作,也是非常重要的一個(gè)環(huán)節(jié)。

git tag //列出已有標(biāo)簽
git tag -l 'v1.8.5'     //使用特定模板進(jìn)行查找

標(biāo)簽分為兩類:輕量標(biāo)簽和附注標(biāo)簽

git tag -a v1.4 -m 'message'

git show v1.2 可以看到標(biāo)簽信息與對(duì)應(yīng)的提交信息

git show [hash]

git tag v1.4    //輕量標(biāo)簽

git tag -a v1.2 9fceb02     //針對(duì)于某個(gè)commit打標(biāo)簽

****************** 共享, ********************
git push不會(huì)將tag推送到遠(yuǎn)程倉庫
git push origin v1.5 // 標(biāo)簽必須顯示推送

git psuh origin --tags // 推送所有

*******************  檢出  ********************
git checkout [tag] // 檢出某個(gè)tag
// 會(huì)處于分離頭指針狀態(tài),,此時(shí)的提交不屬于任何的分支,如需要修改需要新建分支


git checkout -b version2 v2.0.0     // 在特定標(biāo)簽上創(chuàng)建一個(gè)新分支

****************** 刪除tag **********************
git tag -d v1.4
git push origin :refs/tags/v.14

<a name="7vMKv"></a>

分支

分支對(duì)于git來說是非常重要的一個(gè)概念,我們通常會(huì)在主分支上新建新的分支進(jìn)行自己的開發(fā)或者是bug修改。然后等待開發(fā)完成并驗(yàn)證后,在通過合并分支,將我們的新功能或者是bug修改合并到主版本庫

git branch branchName

git branch -v #看本地的分支

git log --oneline --decorate   //查看各個(gè)分支所指的對(duì)象。

git checkout branchName

git checkout -b branchName

git log --oneline --decorate --graph --all      //輸出提交歷史,各個(gè)分支的指向及項(xiàng)目分支匹配情況。

git分支實(shí)質(zhì)上是包含所指對(duì)象校驗(yàn)和(長(zhǎng)度為40的SHA-1值字符串)的文件。

git branch -d branchName

git branch -D branchName

git merge branchName

分支合并的結(jié)果做新的快照,自動(dòng)創(chuàng)建一個(gè)提交指向這個(gè)新的快照。分支合并自動(dòng)選取一個(gè)提交作為共同祖先,以此作為合并的基礎(chǔ)

分支沖突:
1.遇到?jīng)_突,Git會(huì)暫停下來,合并時(shí)可以使用git status 查看因?yàn)闆_突未合并的文件,使用git merge --abort強(qiáng)制合并,使用git add fileName標(biāo)記已解決的沖突。

git branch --merged 或 git branch --no-merged 查看已經(jīng)合并或者尚未合并的分支。

沒有合并過的分支使用git branch -d branchName 刪除會(huì)失敗。


//修改分支名字,遠(yuǎn)程的要?jiǎng)h除重新推
git branch -m oldName newName

<a name="jtXI6"></a>

分支開發(fā)工作流

<a name="lBQ1l"></a>

遠(yuǎn)程分支

遠(yuǎn)程引用是對(duì)遠(yuǎn)程倉庫的引用(指針),包含分支標(biāo)簽等等。git ls-remote顯示地獲取遠(yuǎn)程引用的完整列表,通過git remote show(remote) 獲得遠(yuǎn)程分支的更多信息

git branch --set-upstream branch-name origin/branch-name將本地分支與遠(yuǎn)程分支關(guān)聯(lián)
<a name="7VDOn"></a>

<a name="duyEN"></a>

查看版本倉庫

<a name="JoKHo"></a>

查看當(dāng)前狀態(tài)

查看當(dāng)前git倉庫的狀態(tài),比如說查看我們對(duì)工作區(qū)和貯存區(qū)做了什么更改,或者是我們當(dāng)前處于哪一個(gè)分支都可以使用此命令。

git status
git status --short 或 git status -s //獲得緊湊的格式輸出

// ?? 新添加未跟蹤的文件。
//A 新添加到暫存區(qū)的文件
//M右邊,修改了沒有放到暫存
//M左邊,文件被修改了并放入暫存區(qū)。

<a name="bNuET"></a>

比較版本間差異

通過git的git diff命令,我們可以比較任意文件在兩個(gè)commit之間的差異。

比較暫存區(qū)域和工作目錄:git diff j f b d u 鍵控制翻頁 g G第一行,最后一行 3g 跳到第三行 /或者?+關(guān)鍵詞 上到下,下到上搜索,高亮的是匹配的 n下一個(gè) N 上一個(gè) 輸入h幫助文檔 q退出

git diff   # 工作區(qū)和暫存區(qū)。

git diff --cached / git diff staged  # 暫存區(qū)和版本庫

git diff -- 文件名 # 具體的文件差別  可以多個(gè)文件

git diff masterA materB  # 比較任意兩個(gè)分支

git diff [old-commit] [new-commit-id] -- fileName  # git比較任意兩個(gè)commit之間的差異

<a name="XOv3r"></a>

查看提交記錄 git log

我們可以使用git log命令來查看我們對(duì)版本倉庫的歷史操作信息。

git log     # 按照時(shí)間列出所有更新,最新的在上面,列出SHA-1校驗(yàn)和名字郵箱,提交時(shí)間,說明,只展示當(dāng)前分支
git log -p -2   # 用來顯示每次提交的內(nèi)容差異,2表示僅顯示最近兩次提交。
git log -n2   # 僅顯示最近兩次提交。
git log --stat      # 附帶總結(jié)信息,列出每次被修改的文件
git log --pretty=oneline  # 在同一行顯示
git log --oneline # 同一行顯示
git log --all # 展示所有分支的版本歷史
git log --graph # 圖形化的方式展示
git log branchName # 之查看某個(gè)分支,有all的話這個(gè)不生效

git log --pretty=format:"%h - %an, %ar : %s"
git log --since=2.weeks  //最近兩周
--author指定作者  --grep搜索提交說明中的關(guān)鍵字  如果要的到同時(shí)滿足這兩個(gè)選項(xiàng)的搜索條件的提交,就要用--all-match

-s 列出添加或移除了某些字符串的提交。例如
git log -Sfunction_name

--path指定路徑

git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
   --before="2008-11-01" --no-merges -- t/

git log --oneline --decorate 查看各個(gè)分支當(dāng)前所指向的對(duì)象   
git log --pretty=oneline [fileName]

git log --abbrev-commit   '顯示最簡(jiǎn)短的唯一值'

git help --web log # 通過瀏覽器查看所有

gitk  # 打開圖形化界面

<a name="ANAxu"></a>

文件操作

<a name="2XWcZ"></a>

對(duì)文件重命名

將readme重命名為readme.md

# 方法1
mv readme readme.md # 直接重命名
git add readme.md  # 添加重命名后的文件
git rm readme  # 刪除原來文件

# 方法2 git命令
git mv readme readme.md #使用git mv變更文件名

<a name="wuwRS"></a>

<a name="uUDYh"></a>

重命名文件

git mv file_from file_to

等同于
mv file_from file_to
git rm  file_from
git add file_to

<a name="XLRBw"></a>

刪除文件

git rm 文件名。刪除文件并提交,使文件不再被追蹤。

git rm 文件名 等同于 rm 文件名+git add .

如果刪除之前修改過并放入暫存區(qū)。需要-f強(qiáng)行刪除

git rm --cached 文件名從暫存區(qū)刪除,但保留在工作區(qū)

<a name="dE9Tl"></a>

貯藏代碼

當(dāng)我們對(duì)工作區(qū)和貯存區(qū)的代碼進(jìn)行了更改之后,有額外的任務(wù)插入,我們需要將現(xiàn)在工作區(qū)和貯存區(qū)的內(nèi)容暫時(shí)的存儲(chǔ)起來,此時(shí)便用到了 git stash
<a name="BoxJJ"></a>

git stash

git stash
git stash list
git stash apply // 已暫存的文件不會(huì)被重新暫存
git stash apply --index // 重新暫存已暫存的文件
git stash apply stash@{2}
git stash drop  stash@{2}   //刪除儲(chǔ)藏
git stash pop   // 重新應(yīng)用并刪除
git stash branch branchName //從最新儲(chǔ)藏新建分支,成功后會(huì)刪掉該儲(chǔ)藏
git stash save noteContent // 等同于git stash,但是可以增加注釋
git stash clear //清理所有
git stash show stash@{2} //查看stash和當(dāng)前的差異

<a name="3fa4e3ad"></a>

回退與撤銷

<a name="Glw6W"></a>

撤銷操作

git commit --amend      //第二次提交代替第一次提交的結(jié)果

git reset HEAD <file>...        // 取消暫存。(不加選項(xiàng)只會(huì)修改暫存區(qū)內(nèi)容,所以并不危險(xiǎn))

git checkout -- <file>

<a name="Zgtx7"></a>

暫存區(qū)恢復(fù)到頭指針的狀態(tài)

不保留暫存區(qū)的所有內(nèi)容,將其恢復(fù)到跟head一樣。

  • 首先要將工作區(qū)內(nèi)容 git stash
  • git reset HEAD 將暫存區(qū)的恢復(fù)到了工作區(qū)

<a name="4ilOn"></a>

將暫存區(qū)的恢復(fù)到工作區(qū)

取消工作區(qū)的變更<br />git checkout -- fileName

<a name="jvy9s"></a>

刪除歷史提交中近幾個(gè)commit

git reset --hard hash

<a name="sGHxV"></a>

代碼回退

  • 將暫存區(qū)域恢復(fù)到之前狀態(tài):git reset HEAD 文件名,不指定為所有
  • 將暫存區(qū)的舊版本呢覆蓋回:git checkout -- 文件名
  • 回到過去:
    • 倉庫Repository和暫存區(qū)Stage之間,commit reset
    • 工作空間Working和暫存區(qū)Stage之間,add checkout
    • git reset HEAD~ ~指上一個(gè)
    • git rest --mixed(默認(rèn)的不用寫) HEAD~
      • 移動(dòng)HEAD指向,將其指向上一個(gè)快照
      • 將HEAD移動(dòng)后指向的快照回滾到暫存區(qū)
    • git rest --soft HEAD~
      • 移動(dòng)HEAD指向,將其指向上一個(gè)快照(撤銷一次錯(cuò)誤的提交)
    • git rest --hard HEAD~ (存在危險(xiǎn)性)
      • 移動(dòng)HEAD指向,將其指向上一個(gè)快照
      • 將HEAD移動(dòng)后指向的快照回滾到暫存區(qū)
      • 將暫存區(qū)的文件還原到工作目錄
    1. 移動(dòng)HEAD的指向(--soft)
    2. 將快照混滾到暫存區(qū)域([--mixed], 默認(rèn))
    3. 將暫存區(qū)域還原到工作目錄(--hard)
    • 回滾指定快照,指定前幾個(gè):git reset id號(hào)
    • 回滾快照里個(gè)別文件
      • git reset 快照版本 文件名/路徑
      • git reset 快照版本的ID號(hào)

<a name="44a6ae3f"></a>

遠(yuǎn)程倉庫

git remote      // 列出遠(yuǎn)程倉庫簡(jiǎn)寫

git remote -v       //展示簡(jiǎn)寫和對(duì)應(yīng)的URL

git remote add <shortname> <url>

git fetch [remote-name]     //從遠(yuǎn)程倉庫獲取數(shù)據(jù),執(zhí)行完成,會(huì)擁有遠(yuǎn)程倉庫中所有分支的引用,可以隨時(shí)合并查看。只是將數(shù)據(jù)拉取到本地倉庫,不會(huì)合并或者修改。

git pull 會(huì)自動(dòng)甚至本地的master跟蹤克隆的遠(yuǎn)程倉庫的master

git push origin master      //寫入權(quán)限,之前別人沒有推送過。

git remote show origin 查看某個(gè)遠(yuǎn)程倉庫的信息

git remote rename oldname newname     //修改遠(yuǎn)程倉庫名字,也會(huì)修改你的遠(yuǎn)程分支的名字

git remote rm 倉庫名

git clone -b [branchName] [branchName]

<a name="Ews5p"></a>

多人協(xié)作

多人協(xié)作,不能強(qiáng)制提交,不能變基。

<a name="uNUd8"></a>

多人修改同一個(gè)文件的文件名

會(huì)報(bào)沖突,手動(dòng)解決<br />git rm 源文件名<br />git add 需要的文件名<br />git rm 分期的文件名

<a name="tZdqC"></a>

有人把文件名變更,其他人基于原來的文件名變更了文件內(nèi)容。

git會(huì)自動(dòng)合并。git可以很好的處理這種情況,其他的版本控制不一定能良好處理。

<a name="WdO9g"></a>

高級(jí)使用

<a name="HaVOb"></a>

git chery-pick

git chery-pick可以將某個(gè)commit復(fù)制到當(dāng)前的分支。chery-pick后,處于對(duì)記錄歷史的考慮,Auther是這個(gè)commit原來的提交人,但commiter是自己。

舉例子:將branch1 的 commit1 提交 應(yīng)用到 branch2 分支上來

實(shí)現(xiàn)步驟:

  1. 使用git log 查看需要被應(yīng)用到新分支的commit的 hash是多少。
  2. 切換到branch2 git chery-pick [commit1hash]即可自動(dòng)提交

chery-pick的參數(shù):

  • 在git chery-pick后加上-n可以避免自動(dòng)提交。
  • 在git chery-pick后加上-e可以編輯commit信息。
  • 與git rebase類似,當(dāng)遇到?jīng)_突時(shí)有以下處理辦法, git cherry-pick --continue,git cherry-pick --abort,git cherry-pick --quit。

<a name="yaelu"></a>

將commit之間得差異差異應(yīng)用到新的提交

場(chǎng)景:branchA和branchB的差異應(yīng)用到branchC<br />實(shí)現(xiàn)步驟

  1. git diff后增加 > patch
  2. 切換到branchC
  3. git apply patch
  4. 注意會(huì)在當(dāng)前目錄下生成patch文件,需要手動(dòng)刪除等操作

<a name="UMeBQ"></a>

git鉤子

通過git鉤子,可以使得我們?cè)趫?zhí)行g(shù)it得某些操作時(shí),觸發(fā)一些腳本,比如在提交時(shí)校驗(yàn)我們的commit message是否符合要求,才我們推送代碼到遠(yuǎn)程前,運(yùn)行我們代碼中的單元測(cè)試確保代碼質(zhì)量等。

<a name="7fyKz"></a>

git忽略commit鉤子

  • git commit --no-verify ,這可以使我們得提交不觸發(fā)commit得執(zhí)行。

<a name="z9FRo"></a>

使用git鉤子校驗(yàn)commit message

<a name="hI1qP"></a>

git reflog

git reflog 主要記錄我們對(duì)于git得操作,通過它可以查找到所有分支的所有操作記錄,包括刪除的以及reset的內(nèi)容!當(dāng)我們因?yàn)椴磺‘?dāng)?shù)胓it操作,不小心將我們得代碼刪除了,我們就可以通過git reflog找回我們得代碼。git log存儲(chǔ)在本地。

<a name="ERvGO"></a>

不小心git reset --hard HEAD^找回

不小心將我們得代碼回退到了上個(gè)版本,找回丟失得代碼。

實(shí)現(xiàn)步驟:

  1. 使用git reflog找到我們不小心刪除得commit得commit hash。
  2. 使用chery-pick 找回即可

<a name="ElcKL"></a>

在分離頭指針狀態(tài)下進(jìn)行了提交切換分支之后丟失代碼得找回

實(shí)現(xiàn)步驟與 不小心git reset --hard HEAD^找回 方法相同

<a name="rfo4w"></a>

更改git提交歷史

通過git rebase,我們可以很容易的對(duì)我們的提交歷史做更改。對(duì)提交的歷史進(jìn)行修改,可能會(huì)造成代碼的沖突,我們需要解決沖突。

更改git的提交歷史是非常****危險(xiǎn)****的操作,更改后的分支無法直接推送到遠(yuǎn)程倉庫,****必須強(qiáng)制推送****,如果分支涉及到****多人協(xié)作,****需要特別注意,避免產(chǎn)生不必要的麻煩****。

<a name="YnqTY"></a>

通過變基來整合不同分支的修改

我們已master分支為基準(zhǔn)開發(fā)新的功能,首先我們?yōu)榱碎_發(fā)新的功能切出了新的分支feature1,經(jīng)過一周時(shí)間,我們開發(fā)完畢。在這一周之內(nèi),其他同事也在進(jìn)行正常的開發(fā)并且上線完成,合入到了master分支。此時(shí)我們需要將這一周之內(nèi)其他同事對(duì)于master的更改應(yīng)用到自己的feature1分支上,此時(shí)便可以通過合并分支和變基來實(shí)現(xiàn),通過變基可以使我們的git提交歷史趨與一條直線。他與合并分支的明顯區(qū)別就是,合并分支,會(huì)使得我們的多次commit與這周內(nèi)master變更的commit依照時(shí)間混合在一起,使用變基則會(huì)使得我們得commit順序位于master上得這些提交之后。變基操作可能會(huì)產(chǎn)生沖突。

# 使用合并分支
git merge master

# 使用變基
git rebase master

<a name="80kqP"></a>

修改commit的順序

  1. git rebase -i [commit-hash]
  2. 此時(shí)會(huì)出現(xiàn)一個(gè)編輯窗口,我們直接在編輯窗口內(nèi)移動(dòng)coomit的順序之后保存即可。

常用的vim快捷鍵:復(fù)制:yy, 粘貼p,回退 u ,保存wq

<a name="GsqR4"></a>

借助于git rebase,拆分commit

https://blog.csdn.net/weixin_33736832/article/details/87960663

實(shí)現(xiàn)步驟:

  1. git rebase -i [commit-hash]
  2. 此時(shí)會(huì)出現(xiàn)一個(gè)編輯器窗口,在編輯器內(nèi)出現(xiàn)的是我們所有的commit,將要拆分的commit 前面狀態(tài)改為e,保存編輯的內(nèi)容。
  3. git rebse會(huì)停留在需要拆分的commit。
  4. 此時(shí)使用 git reset HEAD^ 撤銷需要拆分的commit。
  5. 查看當(dāng)前的status,此時(shí)可以按照我們的需要,添加多次提交。
  6. 我們更改玩提交后,git rebase --continue。此時(shí)我們已經(jīng)成功修改了提交記錄

<a name="l8Z2a"></a>

二、Git工具

<a name="00cIU"></a>

選擇修訂版本

<a name="iDKjz"></a>

分支引用

git show [branchName]<br />
git show SHA-1

git rev-parse [branchName] 查看git當(dāng)前處于什么狀態(tài)。

<a name="IqnJZ"></a>

引用日志

git reflog 查看引用日志,每當(dāng)HEAD所指向的位置發(fā)生了變化,git就會(huì)將這個(gè)信息存儲(chǔ)到引用日志。

git show HEAD@{5}

git show master@{yesterday} 查看昨天這個(gè)分支指向了哪次提交。只對(duì)還在引用日志里的數(shù)據(jù)有用。

git log -g 查看類似于 git log 輸出格式的引用日志信息

分支引用只存在于本地倉庫,新克隆則引用日志是空的

<a name="N3X4n"></a>

祖先引用

使用HEAD^來查看上一次提交<br />
HEAD^2 D當(dāng)前提交的第二次父

HEAD~ 指向第一次父提交<br />
HEAD~2 第一父提交的第一父提交

這兩種可以組合

<a name="0u7UT"></a>

提交區(qū)間

git log master..experiment  查看在experiment分支中存在而不在master分支中存在的提交。
git log origin/master..HEAD     查看即將推送到遠(yuǎn)端的內(nèi)容。

留空一邊git默認(rèn)其為HEAD

<a name="N5tS2"></a>

多點(diǎn)

git log refA..refB
git log ^refA refB
git log refB --not refA

與雙點(diǎn)語法區(qū)別。

git log refA refB ^refC
git log refA refB --not refC

<a name="Tnphp"></a>

三點(diǎn)

選出兩個(gè)引用中只有一個(gè)包含的提交<br />
git log master...experiment<br />
增加參數(shù) git log --left-right master...experiment

<a name="e889f8bb"></a>

交互式暫存

交互式暫存,將文件的特定部分組合成提交,修改一組文件后,希望改動(dòng)可以放到若干個(gè)提交而不要混雜在一起。這可以確保提交是邏輯上獨(dú)立的變更集<br />
git add -i<br />
git add --interactive

在命令區(qū)域,可以暫存文件,取消暫存文件,暫存文件的一部分,添加未被追蹤的文件,查看暫存區(qū)內(nèi)容區(qū)別。

<a name="MJa3W"></a>

暫存與取消暫存文件

<a name="ba590b6b"></a>

<a name="Nntl6"></a>

三、git基礎(chǔ)知識(shí)

<a name="fvGob"></a>

.git里面都有什么

  • HEAD文件存儲(chǔ)當(dāng)前的分支,直接編輯與切換分支是同樣的效果
  • config文件存儲(chǔ),針對(duì)于本文件的config
  • refs文件夾 heads對(duì)應(yīng)分支 tags head內(nèi)的文件存儲(chǔ)的是hash值, tags內(nèi)的hash,hash值指的是 commit
  • objects 內(nèi)的文件夾與文件夾內(nèi)的文件組成hash值,使用git cat-file 查看是tree。 使用命令查看數(shù)的內(nèi)容,是一個(gè)文件對(duì)象,通過git cat-file -p hsdh查看就是文件的內(nèi)容
git cat-file -t hash  #命令顯示版本庫對(duì)象的內(nèi)容、類型及大小信息。 看內(nèi)容用-p

commit tree blob是三個(gè)核心的對(duì)象。

只要任何文件的文件內(nèi)容相同,就是唯一的blob

<a name="Mr8Rz"></a>

commit tree blob 三者關(guān)系

[圖片上傳失敗...(image-acb2c9-1583609442636)]<br />一個(gè)commit對(duì)應(yīng)一顆樹,樹代表了commit對(duì)應(yīng)的視圖,視圖里面存儲(chǔ)快照,快照里放了當(dāng)前commit對(duì)應(yīng)的本項(xiàng)目倉庫的所有文件夾以及文件的快照。blob與文件名無關(guān)系。

舉例:<br />空倉庫,下有doc/readme

git add 將文件加入暫存區(qū),那么git就會(huì)在.git/objects下創(chuàng)建對(duì)應(yīng)文件的blob。比如 .git/objects/2d/832d90044c。使用git cat-file -t 2d832d90044c 查看可以發(fā)現(xiàn)類型是blob,通過git cat-file - p t2d832d90044c,可以查看到,文件的具體內(nèi)容

git commit 提交后,那么git就會(huì)在.git/objects下會(huì)有4個(gè)文件.

  • 一個(gè)對(duì)象:tree 內(nèi)容是doc
  • 一個(gè)對(duì)象:blob readme的文件內(nèi)容
  • 一個(gè)對(duì)象:tree 里面readme文件的blob
  • 一個(gè)對(duì)象: commit

<br />
git圖2.png
git圖2.png

<a name="QZGt3"></a>

分離頭指針(detached HEAD)

變更沒有基于某個(gè)branch去做,所以進(jìn)行分支切換時(shí),在分離頭指針之上產(chǎn)生的commit,可能會(huì)被git當(dāng)作垃圾清理掉,如果認(rèn)為變更時(shí)重要的那么,一定要將變更與分支綁到一起。<br />git checkout [commitHash]<br />本質(zhì)上是工作在沒有分支的狀態(tài)下,此時(shí)可以做開發(fā),提交(通過git log可以明顯的看到HEAD沒有與分支關(guān)聯(lián))。如果切換到新的分支,那些沒有與分支關(guān)聯(lián)的變更可能會(huì)被git當(dāng)作垃圾清理掉。要對(duì)分支做變更。git checkout -b new-branch-name。

在分離頭指針時(shí)切換分支git會(huì)提示是否要為已經(jīng)提交的commit建branch, git branch <new-branch-name> <commitHash>

可以利用這一特性做嘗試,當(dāng)丟棄時(shí),直接切換到別的分支即可。

<a name="9ip7C"></a>

特殊標(biāo)識(shí)符HEAD

HEAD不僅可以指代新分支最后一次提交,同時(shí)HEAD還可以不跟分支掛鉤,處于分離頭指針狀態(tài)(指導(dǎo)某個(gè)commit上),如果新建/切換branch,HEAD指針指向新的分支。無論處于什么狀態(tài),HEAD最終會(huì)落腳在commit。

HEAD可以指代commit。<br />git diff HEAD HEAD^ 比較這個(gè)commit和其父commit的提交。

HEAD^^ 等同于 HEAD~2

<a name="hUEe6"></a>

git的備份

可以備份到本地的其他地方。<br />協(xié)議和智能協(xié)議<br />直觀區(qū)別:?jiǎn)f(xié)議傳輸進(jìn)度不不可?見;智能協(xié)議傳輸可?見。<br />傳輸速度:智能協(xié)議?比啞協(xié)議傳輸速度快。

git clone --bare /User//.git ya.git 啞協(xié)議 <br />git clone --bare file:///User//.git zhineng.git 智能協(xié)議
<a name="7EArh"></a>

git remote add zhineg file:///User/**/.git<br />git push 進(jìn)行遠(yuǎn)端備份

<a name="YtZfa"></a>

<a name="tQku9"></a>

<a name="lkj6S"></a>

四、使用問題歸納

<a name="0Cv7z"></a>

本地初始化git倉庫并添加遠(yuǎn)程倉庫

git init
git remote add origin <遠(yuǎn)程倉庫地址>
git add .
git commit -m "注釋"
git pull --rebase origin master
git push origin master

<a name="VTDTW"></a>

<a name="pBtBm"></a>

刪除遠(yuǎn)程分支后本地還可以通過 git branch -a看到

解決<br />https://www.cnblogs.com/taohuaya/p/10912245.html

git branch -a                   #查看所有本地分支和遠(yuǎn)程分支
git remote show origin          #查看remote地址,遠(yuǎn)程分支,還有本地分支與之相對(duì)應(yīng)的關(guān)系等
git remote prune origin [branch] # 根據(jù)提示進(jìn)行此操作,刪除本地分支的branch,這樣就可以在本地刪除遠(yuǎn)程不存在的分支

<a name="SrcWP"></a>

git忽略已經(jīng)提交的文件(.gitignore文件無效)

解決鏈接:http://www.itdecent.cn/p/e5b13480479b

方案一

git rm [ignoreFileName]
git commit -am [commit-message]  #刪除不需要的文件

.gitignore文件中添加忽略規(guī)則,提交.gitignore文件

git push [remote]

方案二

git rm -r --cachced build/*   # 都不需要可以不跟文件名
git add .
git commit -m 'commit '
git push

針對(duì)已經(jīng)commit過且有改動(dòng)的文件 (因?yàn)閞m的是cached列表中的文件, cached列表即修改列表)

最好在創(chuàng)建 git倉庫的同時(shí)就創(chuàng)建.gitignore文件

<a name="nBAyQ"></a>

merge兩個(gè)不相干的分支

git merge -allow-unrelated-histories master orogin/master

<a name="qvuQH"></a>

五、Git可視化軟件推薦

<a name="Y9axO"></a>

六、Git學(xué)習(xí)資源推薦

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

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

  • 一、基本概念: 注:對(duì)于git的分布式概念及其優(yōu)點(diǎn),不重復(fù)說明,自己百度或谷歌。本文中涉及到指令前面有$的,在cm...
    大廠offer閱讀 1,559評(píng)論 0 3
  • 查看、添加、提交、刪除、找回,重置修改文件 git help # 顯示command的help git sho...
    Swiftor閱讀 2,212評(píng)論 0 2
  • Git 是目前最流行的分布式版本控制系統(tǒng)之一。 版本控制指的是,記錄每次版本變更的內(nèi)容和時(shí)間等細(xì)節(jié),保留各版本之間...
    神齊閱讀 1,515評(píng)論 0 7
  • Add & Commit git init 初始化一個(gè) Git 倉庫(repository),即把當(dāng)前所在目錄變成...
    冬絮閱讀 5,134評(píng)論 0 9
  • 1. GIT命令 git init在本地新建一個(gè)repo,進(jìn)入一個(gè)項(xiàng)目目錄,執(zhí)行g(shù)it init,會(huì)初始化一個(gè)re...
    江邊一蓑煙閱讀 895評(píng)論 0 0

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