Git基本概念了解
為了方便以及我們之后正確的了解Git的各個(gè)指令的操作含義,我們需要了解幾個(gè)概念
Git和SVN的差異,以及Git的優(yōu)勢(shì).
- SVN 是集中式管理, 所以如果最為公共倉(cāng)庫(kù)的的中央服務(wù)器出問(wèn)題, 所有的工作者都將受到影響.
SVN無(wú)法做到本地分支處理, 所以當(dāng)你去實(shí)現(xiàn)一個(gè)需要長(zhǎng)時(shí)間的,創(chuàng)新性的,需要不斷探索的功能的時(shí)候,就有可能陷入兩難的局面: 1.如果提交代碼可能會(huì)影響到項(xiàng)目的其他模塊以及他人工作. 2. 不提交代碼就無(wú)法很好的保護(hù)代碼版本, 當(dāng)你自己想要回到某個(gè)代碼片段的時(shí)候就無(wú)法做到. - Git 是分布式管理, 作為客戶端不止是提取了公共倉(cāng)庫(kù)的文件快照, 而是把代碼完整的鏡像下來(lái), 所以.如果協(xié)同工作的服務(wù)器出現(xiàn)了什么故障, 也可以時(shí)候通過(guò)本地鏡像文件去很好的恢復(fù).
另外因?yàn)镚it是提供本地的倉(cāng)庫(kù)管理系統(tǒng), 所以對(duì)于網(wǎng)絡(luò)的依賴度并不高. 就算沒(méi)有網(wǎng)也依然可以繼續(xù)工作.等到有網(wǎng)絡(luò)的時(shí)候再推送到公共服務(wù)器即可.
Git的文件狀態(tài) (Git可以整體把文件分為已跟蹤,和未開(kāi)始跟蹤的兩種狀態(tài))
- 已修改(modifired): 表示修改了文件, 但是還沒(méi)有保存到本地?cái)?shù)據(jù)庫(kù)中.(即文件的修改部分是Git的未跟蹤狀態(tài))
- 已暫存(staged) : 表示對(duì)一個(gè)已修改文件的當(dāng)前版本做了標(biāo)記, 使之包含在下次可以提交的內(nèi)容中去
- 已提交(commit) : 表示數(shù)據(jù)已經(jīng)安全的保存在了本地?cái)?shù)據(jù)庫(kù)中.
基本的Git 工作流程
- 在工作目錄中修改文件
- 暫存文件, 將文件的快照放入暫存區(qū)域
- 提交更新, 找到暫存區(qū)域的文件,將快照永久性存儲(chǔ)到Git倉(cāng)庫(kù)目錄
因?yàn)楝F(xiàn)在我們?cè)谑褂肎it的時(shí)候一般都是會(huì)關(guān)聯(lián)一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的, 所以在鏈接遠(yuǎn)程倉(cāng)庫(kù)的前提下,如果你想將本地的代碼提交到遠(yuǎn)程公共倉(cāng)庫(kù), 即在這三步之后先更新代碼,然后將代碼推送到遠(yuǎn)程倉(cāng)庫(kù)即可.
這里也要給一個(gè)小的提示,我們?cè)谂渲肎it倉(cāng)庫(kù)的時(shí)候 一定要配置忽略文件. 因?yàn)槠渌恼聦懙亩纪Σ诲e(cuò)的, 所以這篇文章就不在做多余的贅述 , 下面給出幾個(gè)忽略文件配置的參考文章 Git忽略文件的具體配置, Git忽略文件配置
常規(guī)流程中的具體指令
git help
查看git指令幫助說(shuō)明文檔, 后續(xù)可以跟具體的指令來(lái)查看指定的幫助.-
git status
查看文件狀態(tài), 可以看到你的哪些文件做了更改以及新增了哪些文件, 是否已經(jīng)提交到了本地倉(cāng)庫(kù),以及是否有需要上傳到遠(yuǎn)程的文件.
建議經(jīng)常使用.你可以在你提交文件之前先查看一下你的文件狀態(tài), 查看有哪些文件沒(méi)有提交, 以及提交之后時(shí)候有沖突之類.git status 文件名
查看指定文件的狀態(tài)下面舉例一下各種狀態(tài)下status 的輸出情況:(下面舉例中的
XXXX
都用來(lái)表示為項(xiàng)目中的文件)
如下的情況說(shuō)明你的Git文件當(dāng)前狀態(tài)是十分干凈的,沒(méi)有什么文件改動(dòng), 也沒(méi)有什么未跟蹤的文件.并標(biāo)示出來(lái)當(dāng)前所處分支
$ git status
On branch master
nothing to commit, working directory clean
而如果出現(xiàn)如下情況, 即有Untracked files:
, 并且其下面有內(nèi)容, 則表示有新文件沒(méi)有被跟蹤到, 需要先加入到暫存當(dāng)中,才能在下次提交中提交該文件
$ echo 'My Project' > README
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
XXXX
nothing added to commit but untracked files present (use "git add" to track)
或者說(shuō)是修改了一個(gè)已經(jīng)被跟蹤的文件,則他的再次更改的部分就可以理解成為是沒(méi)有被標(biāo)記跟蹤的狀態(tài), status會(huì)有以下大概輸出格式 Changes not staged for commit:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: XXXX
當(dāng)已經(jīng)有文件已經(jīng)添加入暫存區(qū), 但是還未提交時(shí), status會(huì)做如下顯示, 即Changes to be committed:
會(huì)顯示,并在下方會(huì)有內(nèi)容
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: XXX
modified: XXXX
其實(shí)你會(huì)發(fā)現(xiàn)以上的status輸出中, Git都是會(huì)給出我們操作提示的, 比如在第一種情況下,有文件添加的時(shí)候, Git會(huì)在下方提示(use "git add <file>..." to include in what will be committed)
. 就是來(lái)提示你可以使用 git add xxxx
的指令來(lái)進(jìn)行操作
-
git status -s
或者git status -- short
如果你覺(jué)得上面status
的輸出格式不夠簡(jiǎn)潔,太過(guò)繁雜的話, 可以使用這個(gè)指令.轉(zhuǎn)換為一種緊湊型的status格式輸出. 用一下舉例
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
其中 :
??
表示了這個(gè)文件尚未被標(biāo)記跟蹤,
A
表示新添加到暫存區(qū)的文件
M
表示修改的文件.
如果你仔細(xì)觀察就會(huì)發(fā)現(xiàn)M
出現(xiàn)的位置是會(huì)有差異的, 當(dāng)M
出現(xiàn)在靠右的位置的時(shí)候,代表了這個(gè)這個(gè)文件的修改部分還沒(méi)有加入到暫存區(qū), (即下次的提交是無(wú)法提交這個(gè)文件的修改部分, 如果提交就需要先放入暫存區(qū)). 而靠左邊的M
則表示了文件的修改部分已經(jīng)放入到了修改區(qū)域.
而像上圖示例中的Rakefile
文件. 左右兩個(gè)位置都標(biāo)識(shí)出來(lái)了M
, 則表示之前add到暫存區(qū)了一份修改之后, 本地又再次做了一些修改, 所以一部分修改在暫存區(qū)沒(méi)有提交, 還有一部分修改尚未添加到暫存區(qū). 這里我們就要注意到, 我們實(shí)際上提交的文件, 是以加入到暫存區(qū)的修改文件為最后的提交文件的,而不是你最后的提交時(shí)間為止的修改文件, 所以一定要注意如果在將文件加入暫存區(qū)之后又做了修改不要忘記將其放入暫存區(qū)
獲取/創(chuàng)建項(xiàng)目
-
git init
在當(dāng)前文件路徑下初始化一個(gè)git倉(cāng)庫(kù)-
git init 路徑名稱
在指定的路徑下初始化倉(cāng)庫(kù)
-
git clone 遠(yuǎn)程倉(cāng)庫(kù)地址
建立Git本地倉(cāng)庫(kù)管理,關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù),并將內(nèi)容拉取下來(lái).
其實(shí)這個(gè)指令是幾個(gè)指令的一個(gè)封裝來(lái)實(shí)現(xiàn)效果的, 它創(chuàng)建了一個(gè)新的目錄, 切換到新目錄.然后git init
來(lái)初始化一個(gè)空的Git倉(cāng)庫(kù),之后關(guān)聯(lián)你指定的遠(yuǎn)程倉(cāng)庫(kù) (git remote add
), 再對(duì)遠(yuǎn)程倉(cāng)庫(kù)git fetch
, 最后通過(guò)git checkout
將遠(yuǎn)程倉(cāng)庫(kù)的最新提交檢出到本地的工作目錄
一般情況下,如果遠(yuǎn)程倉(cāng)庫(kù)有一個(gè)已經(jīng)在制作的項(xiàng)目, 而你需要本地從零開(kāi)始跟進(jìn)這個(gè)項(xiàng)目,可以直接用這個(gè)指令將項(xiàng)目拉取下來(lái)進(jìn)行跟進(jìn).
Git倉(cāng)庫(kù)配置
-
git config
git的配置信息. 單獨(dú)這樣配置, 作用域只是你當(dāng)前的這一個(gè)git項(xiàng)目-
git config user.name xxx
配置你的個(gè)人用戶名稱. 這個(gè)比較重要一點(diǎn), 用來(lái)查看說(shuō)明是誰(shuí)提交了更新. -
git config user.email xxx
配置你的郵箱信息. -
git config -l
或者git config --list
查看你的git配置信息 -
git config --global
配置全局的Git信息. 可以理解為將作用域擴(kuò)大到了你的整個(gè)電腦. 這樣當(dāng)你全局配置了一些通用信息之后 新的git項(xiàng)目就可以不用再次手動(dòng)配置, 建議 用戶名以及郵箱 如果沒(méi)有特殊需求可以直接這樣配置即可, 省事兒.
用法也只是在中間加了--global
. 后面的指令使用和 之前的一樣, 比如你要設(shè)置全局的用戶名, 即git config --global user.name xxx
-
遠(yuǎn)程倉(cāng)庫(kù)相關(guān)
-
git remote
通常在我們執(zhí)行對(duì)遠(yuǎn)程倉(cāng)庫(kù)的相關(guān)操作的時(shí)候, 都會(huì)以此命令作為前綴 -
git remote add [remote-name] [URL]
給Git倉(cāng)庫(kù)新添一個(gè)遠(yuǎn)程倉(cāng)庫(kù), 你可以給同一個(gè)項(xiàng)目添加多個(gè)遠(yuǎn)程倉(cāng)庫(kù), 來(lái)處理不同的需求,和他人合作.-
[remote-name]
是你對(duì)這個(gè)遠(yuǎn)程倉(cāng)庫(kù)設(shè)置的一個(gè)簡(jiǎn)稱, 你可以在后續(xù)的操作中用這個(gè)簡(jiǎn)稱指代這個(gè)遠(yuǎn)程倉(cāng)庫(kù). 通常沒(méi)有什么特別的需求且你這個(gè)Git倉(cāng)庫(kù)只需要鏈接一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的話,那么你的這個(gè)遠(yuǎn)程倉(cāng)庫(kù)可以設(shè)置為默認(rèn)名origin
. - [URL] 即為你的遠(yuǎn)程倉(cāng)庫(kù)地址.
-
-
git remote -v
查看當(dāng)前項(xiàng)目所連接的所有遠(yuǎn)程倉(cāng)庫(kù)
如果你有多個(gè)遠(yuǎn)程倉(cāng)庫(kù), 你會(huì)受到一個(gè)類似于下方的輸出
$ git remote -v
bakkdoor https://github.com/bakkdoor/grit (fetch)
bakkdoor https://github.com/bakkdoor/grit (push)
cho45 https://github.com/cho45/grit (fetch)
cho45 https://github.com/cho45/grit (push)
defunkt https://github.com/defunkt/grit (fetch)
defunkt https://github.com/defunkt/grit (push)
#fetch : 標(biāo)識(shí)了你的拉取地址
#push : 標(biāo)識(shí)了你的推送數(shù)據(jù)的地址
-
git remote show [rename-name]
查看指定的遠(yuǎn)程倉(cāng)庫(kù)的信息.
可以看到遠(yuǎn)程倉(cāng)庫(kù)都有哪些倉(cāng)庫(kù), 這些倉(cāng)庫(kù)本地是否已經(jīng)標(biāo)記跟蹤. 從遠(yuǎn)程倉(cāng)庫(kù)的拉取的數(shù)據(jù)會(huì)和本地的哪一個(gè)分支合并數(shù)據(jù). 本地分支的數(shù)據(jù)會(huì)推送給遠(yuǎn)程倉(cāng)庫(kù)的哪一個(gè)分支等. 具體可以看到以下示例.
$ git remote show origin
* remote origin
Fetch URL: https://github.com/schacon/ticgit
Push URL: https://github.com/schacon/ticgit
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
-
git remote rename [remote-old-name] [remote-new-name]
對(duì)遠(yuǎn)程倉(cāng)庫(kù)的進(jìn)行重命名,[remote-old-name]
表示的是你的遠(yuǎn)程倉(cāng)庫(kù)當(dāng)前的簡(jiǎn)稱.[remote-new-name]
表示的是需要改成的名字. -
git remote rm [remote-name]
移除遠(yuǎn)程倉(cāng)庫(kù)的關(guān)聯(lián)
添加/修改文件/解決沖突
-
git add 文件名
或者git add .
add
指令是一個(gè)多功能指令它可以有以下功能:
1.給指定文件添加跟蹤放入暫存區(qū)
2.把已經(jīng)跟蹤的文件放到暫存區(qū)
3.把合并時(shí)有沖突的文件標(biāo)記為已解決狀態(tài)
在Git當(dāng)中, 我們不能把add
理解成添加文件到下一次的提交, 而要把他理解成添加了內(nèi)容到下一次的提交當(dāng)中.可能當(dāng)你從SVN轉(zhuǎn)過(guò)來(lái)之后可能剛開(kāi)始會(huì)有點(diǎn)疑惑, 為什么有的文件你已經(jīng)add過(guò)了, 你依然需要使用add 指令將其加入暫存區(qū). 因?yàn)槟闶褂胊dd指令添加的是內(nèi)容, 而不是內(nèi)容,這么想的話,可能會(huì)更好理解一點(diǎn)吧.
如果你需要add的文件很多, 或者你懶得去打文件名. 你可以使用git add.
( 注意, 后面跟的是一個(gè)<space>.
)
這個(gè)指令可以自動(dòng)將所有未標(biāo)記跟蹤的內(nèi)容加入暫存區(qū).
提交文件
-
git commit 文件名 -m 提交信息/備注
將暫緩區(qū)的文件提交到當(dāng)前的本地分支倉(cāng)庫(kù).
注意!,一定要跟提交信息, (可以用-m
或者-F
). , 只有寫了信息才會(huì)提交成功,如果你提交的時(shí)候沒(méi)有編寫信息會(huì)進(jìn)入vim編輯讓你編輯提交信息, 如果你對(duì)vim不熟的話還是直接 用:q
退出后重新提交吧.
這邊需要注意的是 如果你使用 -m 指令后面直接跟信息的話, 如果信息是英文, 則需要用
''
將信息包裹, 否則git會(huì)不識(shí)別, 并會(huì)報(bào)一下錯(cuò)誤. 猜測(cè)在純英文狀態(tài)下無(wú)法識(shí)別為字符串吧
fatal: Paths with -a does not make sense.
-
git commit -a -m 提交信息/備注
或者git commit --all -m 提交信息/備注
將已經(jīng)標(biāo)記的文件修改跳過(guò)暫存區(qū), 直接提交上去 . 其實(shí)就是減少了我們的工作流程, 減少了add的這一步
但是需要注意的是:
這個(gè)指令是對(duì)已經(jīng)處于標(biāo)記的文件有效,(即本身文件在Git倉(cāng)庫(kù)中存在, 只是做了內(nèi)容修改的文件) 如果有新增的文件, 則不能夠直接用commit -a
去省略操作了. 還是需要將新添文件加入(add .
)暫緩區(qū),添加git標(biāo)記,使git能夠跟蹤才可以
查閱/對(duì)比不同
*git log
查閱log信息
需要注意的是,這樣會(huì)進(jìn)入vim格式. 查閱完畢可以使用wq
退出閱覽.
大概出現(xiàn)的格式如下
// (HEAD->master)代表了我master分支上最新的本地提交.
commit 029c5159d8db32fb70d36db0df35312ee346730a (HEAD -> master)
Author: XXX <XXXX@XXX.com>
Date: Mon Oct 15 18:27:27 2018 +0800
項(xiàng)目信息相關(guān)
// 后邊的(origin/master)代表了我在遠(yuǎn)程倉(cāng)庫(kù)是同步到了這里
commit c3ceb15e42c9af3c8bb1134e165cec5a89f204d5 (origin/master)
Author: XXXX <XXXXX@XXX.com>
Date: Thu Aug 30 18:13:27 2018 +0800
msg
commit 99615aad5faf0dd4ce989e6b86e21e81fef01013
Merge: 0f746f0 50938c4
Author: XXX <XXX@XXX.com>
Date: Mon Aug 20 18:59:27 2018 +0800
Merge branch 'master' of https://github.com/xxx/xxx
commit 0f746f04b01b0bc4878169ce35e0ad0938bdcfcc
Author: XXX <XXX@XXX.com>
Date: Mon Aug 20 18:56:34 2018 +0800
在log 中我們不止能夠看到我們每次提交的消息提示, 也能看到每次提交的commitID, 用來(lái)區(qū)分每次的提交.
并且也能夠清楚我們本地文件與遠(yuǎn)程倉(cāng)庫(kù)是否同步.
推送到遠(yuǎn)程倉(cāng)庫(kù)
-
git push [remote-name] [branch-name]
將本地文件中你所指定的分支(branch-name
)內(nèi)容, 推送到指定遠(yuǎn)程倉(cāng)庫(kù)(remote-name
).
需要注意的是,如果遠(yuǎn)程倉(cāng)庫(kù)中有數(shù)據(jù)是你沒(méi)有拉取下來(lái)的,那么你需要先執(zhí)行git pull
指令將數(shù)據(jù)拉取下來(lái),然后再push.否則會(huì)報(bào)錯(cuò).和SVN使用的時(shí)候需要先update 再commit同理.-
remote-name
:是你對(duì)遠(yuǎn)程倉(cāng)庫(kù)的簡(jiǎn)寫名 .如果你沒(méi)有特殊設(shè)置的話.默認(rèn)名為origin
.如果你是使用了clone
指令克隆的一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的話,那么Git會(huì)默認(rèn)設(shè)置成origin
. -
branch-name
是你的分支名稱, 如果你是在默認(rèn)分支上, 而你有沒(méi)有特別命名的話, 默認(rèn)名為master
-
git push [remote-name]
如果你所在分支于遠(yuǎn)程倉(cāng)庫(kù)分支存在標(biāo)記跟蹤關(guān)系, 則可以省略后面的[branch-name]
,git會(huì)默認(rèn)推送當(dāng)前所在分支到遠(yuǎn)程倉(cāng)庫(kù)所在分支git push
如果你所在分支僅存在一條標(biāo)記追蹤關(guān)系, 則[remote-name]
糖声、[branch-name]
都可以省略. git會(huì)默認(rèn)推送當(dāng)前分支到對(duì)應(yīng)的遠(yuǎn)程倉(cāng)庫(kù)分支.
我們通常的提交操作可以使用如下流程指令:
git status
查看狀態(tài),如果有新增文件 則執(zhí)行git add .
git commit -a -m [提交信息]
提交到本地倉(cāng)庫(kù)- 如果需要推送到遠(yuǎn)程倉(cāng)庫(kù)則執(zhí)行
git push
(在你沒(méi)有更改默認(rèn)remote-name
以及分支名的情況下)git status
查看是否完整成功提交代碼.
寫在最后
本篇文章所總結(jié)的內(nèi)容, 均是從GitBook中學(xué)習(xí)總結(jié)的, 如果你想系統(tǒng)而仔細(xì)的去了解git的話.還是推薦你去用GitBook中看一下.
如果這篇文章真的能夠幫助到了看文章的你的話, 那將是對(duì)我來(lái)說(shuō)最好的鼓勵(lì)了, 還希望你能夠用一個(gè)小心心告訴我哦.
持續(xù)更新ing....