Git基礎(chǔ)
通過(guò)上一篇Git:一文章伺帘,我們大體了解了創(chuàng)建倉(cāng)庫(kù)卒密,提交代碼等相關(guān)流程庇谆,本篇重點(diǎn)介紹git相關(guān)的基礎(chǔ)操作岳掐。
git init 初始化倉(cāng)庫(kù)
創(chuàng)建一個(gè)目錄,然后在該目錄下敲入初始化代碼:
mkdir gitDir 創(chuàng)建gitDir目錄
cd gitDir 跳轉(zhuǎn)到gitDir目錄
git init 初始化倉(cāng)庫(kù)
ls -a 查詢當(dāng)前目錄所有文件(包括隱藏文件)
生成的.git存儲(chǔ)當(dāng)前目錄內(nèi)容所需的倉(cāng)庫(kù)數(shù)據(jù)
git status 查看倉(cāng)庫(kù)狀態(tài)
輸入命令后顯示:
我們可以通過(guò)vi/touch 1.c在本目錄下新建1.c文件饭耳,也可以通過(guò)界面手動(dòng)新建該文件,再輸入 git status
,則顯示:
通過(guò)rm -rf 1.c或手動(dòng)刪除后串述,又恢復(fù)之前沒(méi)有文件提交的狀態(tài)。
git add 向暫存區(qū)添加文件
暫存區(qū)是提交之前的一個(gè)臨時(shí)區(qū)域寞肖。通過(guò) git add 1.c
把1.c添加到暫存區(qū)纲酗,然后通過(guò) git status
查看:
git commit 保存?zhèn)}庫(kù)的歷史記錄
git commit -m "日志"
可以直接 git commit
,執(zhí)行后編輯器就會(huì)打開(kāi):
提交日志的格式如下:
行數(shù) | 內(nèi)容 |
-----: | :--------
第一行 | 用一行文字簡(jiǎn)述提交的更改內(nèi)容 |
|第二行 | 空格 |
| 第三行以后 | 記錄更改的原因和詳細(xì)內(nèi)容 |
dog | bird | cat |
---|---|---|
foo | foo | foo |
bar | bar | bar |
baz | baz | baz |
如果不填,表示中斷提交
git log 查看提交日志
查看以往倉(cāng)庫(kù)中提交的日志
可以通過(guò)
git log --pretty=short
顯示簡(jiǎn)短日志;可以通過(guò)
git log 目錄名/文件名
顯示對(duì)應(yīng)目錄名或文件名相關(guān)日志;可以通過(guò)
git log -p (文件名)
查看前后提交的差別
git diff 查看更改前后的差別
查看工作樹(shù)新蟆、暫存區(qū)觅赊、最新提交之間的差別
在1.c文件中添加 #include<stdio.h>
代碼保存后,然后輸入 git diff
:
將1.c加入暫存區(qū)后再執(zhí)行
git diff
由于工作樹(shù)和暫存區(qū)之間并無(wú)差別琼稻,所以不會(huì)顯示什么結(jié)果吮螺。這時(shí)執(zhí)行 git diff HEAD
可以看到差異,HEAD 是指向當(dāng)前分支的最后一次提交的指針。
分支操作
master分支是Git默認(rèn)創(chuàng)建的分支规脸,所有的開(kāi)發(fā)都是以master分支為中心坯约。
分支可以使多人并行開(kāi)發(fā),最后與master分支合并莫鸭。
git branch 顯示分支
其中 * 表示當(dāng)前所在分支闹丐,現(xiàn)在只有一個(gè)master分支
git checkout -b 創(chuàng)建切換分支
我們創(chuàng)建了feature-A分支并且切換到該分支,現(xiàn)在我們有2個(gè)分支了被因。改代碼和下列代碼起到相同的效果:
git branch feature-A //創(chuàng)建分支feature-A
git checkout feature-A //切換到feature-A分支
下面通過(guò)feature-A分支中對(duì)1.c進(jìn)行編輯卿拴,如下:
添加了main函數(shù),接下來(lái)可通過(guò)
git status
git add 1.c
git commit -m "add main method"
等相繼操作添加到feature-A中梨与。通過(guò)
git checkout master
切換到master中堕花,查看1.c文件是否有改動(dòng)。我們發(fā)現(xiàn)沒(méi)有改動(dòng)粥鞋,可見(jiàn)feature-A分支的變動(dòng)沒(méi)有影響主分支缘挽。git checkout -
可以回到上一個(gè)分支
git merge 合并分支
先切換回master分支,通過(guò) git branch
查看現(xiàn)在在什么分支呻粹。
git merge --no-ff feature-A
--no-ff表示在歷史記錄中明確記錄下本次分支合并
如果合并出現(xiàn)沖突等壕曼,后續(xù)再說(shuō)怎么解決沖突。
git log --graph 圖表形式查看
具體可以在終端輸入看看等浊。
更改提交操作
git reset 回溯歷史版本
要讓暫存區(qū)腮郊、HEAD、當(dāng)前工作樹(shù)回溯到指定狀態(tài)筹燕,用
git reset --hard 指定時(shí)間的哈希值
通過(guò)
git log
查找日志:其中 commit 之后的一串字符就是哈希值
git reflog 當(dāng)前倉(cāng)庫(kù)執(zhí)行過(guò)的操作日志
git log
只能查看以當(dāng)前狀態(tài)為終點(diǎn)的歷史日志轧飞,而 git reflog
可以查看當(dāng)前倉(cāng)庫(kù)的日志:
只要不進(jìn)行垃圾回收(Garbage Collection),就可以通過(guò)日志調(diào)取近期的歷史狀態(tài)。其中前面黃色的字符串也是哈希值撒踪,哈希值只要輸入4位以上就可以了过咬。我們可以通過(guò)哈希值回到任何歷史狀態(tài)。
解決沖突
創(chuàng)建一個(gè)分支feature-B,然后修改1.c文件制妄,具體代碼為:
git checkout -b feature-B //創(chuàng)建feature-B分支
//修改feature-B中1.c為:
#include<stdio.h>
int main(){
printf("feature-B");
return 0;
}
//修改master中1.c為:
#include<stdio.h>
int main(){
printf("master");
return 0;
}
現(xiàn)在基礎(chǔ)操作都完成了援奢,因?yàn)閙aster和feature-B都修改了1.c文件,我們合并master和feature-B分支后提示我遇到?jīng)_突了:
打開(kāi)1.c文件可以看到:
HEAD中的是當(dāng)前的內(nèi)容忍捡,feature-B中的是feature-B的內(nèi)容,只要?jiǎng)h除其中一個(gè)就可以切黔。然后加入到暫存區(qū)砸脊,然后提交,我寫(xiě)的提交日志為"fix conflict",下面會(huì)用到纬霞。
git commit --amend 修改提交信息
該命令是修改上一次提交的日志:
我已經(jīng)修改為如圖所示凌埂。
git rebase -i 壓縮歷史
在合并分支之前發(fā)現(xiàn)已提交的內(nèi)容有一些錯(cuò)誤,不妨提交一個(gè)修改诗芜,把這個(gè)修改包含到前一個(gè)提交中瞳抓,壓縮成一個(gè)歷史記錄埃疫。
創(chuàng)建一個(gè)分支feature-D,并修改1.c文件如圖:
然后加入暫存區(qū)和提交
git commti -am "日志"
一步完成這2步操作,我提交的日志為"add feature-D"。但是我提交后發(fā)現(xiàn)我拼寫(xiě)錯(cuò)誤,所以我們需要修改之后重新加入暫存區(qū)后再提交:可以看到修改后提交孩哑,日志為"fix typo",用
git log
查看為:可以通過(guò)
git rebase -i HEAD~2
來(lái)壓縮歷史記錄栓霜,其中fix typo本不應(yīng)該出現(xiàn)在歷史記錄中的,HEAD~2 是最近2次的提交記錄,顯示如圖所示信息:可以通過(guò)把pick改為fixup然后保存提交横蜒,之后再用
git log
查看歷史記錄可以發(fā)現(xiàn)已經(jīng)沒(méi)有"fix typo" 等記錄了胳蛮。
遠(yuǎn)程倉(cāng)庫(kù)的推送和獲取
推送至遠(yuǎn)程倉(cāng)庫(kù)
在GitHub上創(chuàng)建一個(gè)和本地倉(cāng)庫(kù)相同的倉(cāng)庫(kù)名,具體怎么創(chuàng)建倉(cāng)庫(kù)請(qǐng)參考上一篇丛晌。
- 創(chuàng)建好遠(yuǎn)程倉(cāng)庫(kù)之后仅炊,
git remote add origin git@github.com:用戶名/倉(cāng)庫(kù)名.git
將它設(shè)置成本地倉(cāng)庫(kù)的遠(yuǎn)程倉(cāng)庫(kù),origin 遠(yuǎn)程倉(cāng)庫(kù)的名稱設(shè)置為該標(biāo)志符 -
git push -u origin master
澎蛛,git push將本地倉(cāng)庫(kù)的master的內(nèi)容推送到遠(yuǎn)程倉(cāng)庫(kù)抚垄。-u參數(shù)在推送同時(shí)將origin倉(cāng)庫(kù)的master分支設(shè)置為本地倉(cāng)庫(kù)當(dāng)前分支的upstream(上游),以后運(yùn)行g(shù)it pull從遠(yuǎn)程倉(cāng)庫(kù)獲取內(nèi)容時(shí)谋逻,本地倉(cāng)庫(kù)的這個(gè)分支可以直接從origin的master分支獲取內(nèi)容呆馁,省去了另外添加參數(shù)。
在GitHub的結(jié)果如下:
3.也可以推送其他分支到遠(yuǎn)程倉(cāng)庫(kù)斤贰。我們?cè)囍扑蚮eature-B到遠(yuǎn)程倉(cāng)庫(kù)
我這邊 origin 標(biāo)示符智哀,我寫(xiě)的default,大家可以自己選擇。最后在GitHub上的結(jié)果為:
看荧恍,我們已經(jīng)把feature-B分支推送到GitHub上的遠(yuǎn)程倉(cāng)庫(kù)了瓷叫。
oh, great!
從遠(yuǎn)程倉(cāng)庫(kù)中獲取
git clone 獲取遠(yuǎn)程倉(cāng)庫(kù)
換一個(gè)目錄,然后輸入 git clone git@github.com:用戶名/倉(cāng)庫(kù)名.git
就會(huì)克隆到本地送巡。然后輸入 git branch -a
可以查看分支摹菠,-a分支不僅可以查看本地分支也可以查看遠(yuǎn)程的:
上面我們看到只是把master分支克隆到本地,沒(méi)有feature-B,現(xiàn)在我們獲取feature-B分支:
然后我們可以修改feature-B中1.c文件骗爆,然后:
git add 1.c
git commit -m "日志"
git push //推送到遠(yuǎn)程倉(cāng)庫(kù)
成功后可到GitHub中去查:
git pull 獲取最新遠(yuǎn)程倉(cāng)庫(kù)的分支
OK,Done!
相關(guān)
Pro Git:https://git-scm.com/book/zh/v1
LearnGitBranching:http://pcottle.github.io/learnGitBranching/
總結(jié)
至此Git相關(guān)操作都差不多介紹完了次氨,希望通過(guò)我的介紹能讓大家對(duì)Git有基本的了解。