
Git基礎(chǔ)
通過上一篇Git:一文章,我們大體了解了創(chuàng)建倉庫,提交代碼等相關(guān)流程,本篇重點介紹git相關(guān)的基礎(chǔ)操作。
git init 初始化倉庫
創(chuàng)建一個目錄,然后在該目錄下敲入初始化代碼:
mkdir gitDir 創(chuàng)建gitDir目錄
cd gitDir 跳轉(zhuǎn)到gitDir目錄
git init 初始化倉庫
ls -a 查詢當前目錄所有文件(包括隱藏文件)
生成的.git存儲當前目錄內(nèi)容所需的倉庫數(shù)據(jù)
git status 查看倉庫狀態(tài)
輸入命令后顯示:

我們可以通過vi/touch 1.c在本目錄下新建1.c文件,也可以通過界面手動新建該文件,再輸入 git status,則顯示:

通過rm -rf 1.c或手動刪除后,又恢復(fù)之前沒有文件提交的狀態(tài)。
git add 向暫存區(qū)添加文件
暫存區(qū)是提交之前的一個臨時區(qū)域。通過 git add 1.c 把1.c添加到暫存區(qū),然后通過 git status 查看:

git commit 保存?zhèn)}庫的歷史記錄
git commit -m "日志"
可以直接 git commit ,執(zhí)行后編輯器就會打開:

提交日志的格式如下:
行數(shù) | 內(nèi)容 |
-----: | :--------
第一行 | 用一行文字簡述提交的更改內(nèi)容 |
|第二行 | 空格 |
| 第三行以后 | 記錄更改的原因和詳細內(nèi)容 |
| dog | bird | cat |
|---|---|---|
| foo | foo | foo |
| bar | bar | bar |
| baz | baz | baz |
如果不填,表示中斷提交
git log 查看提交日志
查看以往倉庫中提交的日志

可以通過
git log --pretty=short 顯示簡短日志;可以通過
git log 目錄名/文件名 顯示對應(yīng)目錄名或文件名相關(guān)日志;可以通過
git log -p (文件名) 查看前后提交的差別
git diff 查看更改前后的差別
查看工作樹、暫存區(qū)、最新提交之間的差別
在1.c文件中添加 #include<stdio.h> 代碼保存后,然后輸入 git diff:

將1.c加入暫存區(qū)后再執(zhí)行
git diff 由于工作樹和暫存區(qū)之間并無差別,所以不會顯示什么結(jié)果。這時執(zhí)行 git diff HEAD 可以看到差異,HEAD 是指向當前分支的最后一次提交的指針。
分支操作
master分支是Git默認創(chuàng)建的分支,所有的開發(fā)都是以master分支為中心。
分支可以使多人并行開發(fā),最后與master分支合并。
git branch 顯示分支

其中 * 表示當前所在分支,現(xiàn)在只有一個master分支
git checkout -b 創(chuàng)建切換分支

我們創(chuàng)建了feature-A分支并且切換到該分支,現(xiàn)在我們有2個分支了。改代碼和下列代碼起到相同的效果:
git branch feature-A //創(chuàng)建分支feature-A
git checkout feature-A //切換到feature-A分支
下面通過feature-A分支中對1.c進行編輯,如下:

添加了main函數(shù),接下來可通過
git status git add 1.c git commit -m "add main method" 等相繼操作添加到feature-A中。通過
git checkout master 切換到master中,查看1.c文件是否有改動。我們發(fā)現(xiàn)沒有改動,可見feature-A分支的變動沒有影響主分支。git checkout - 可以回到上一個分支
git merge 合并分支
先切換回master分支,通過 git branch 查看現(xiàn)在在什么分支。
git merge --no-ff feature-A
--no-ff表示在歷史記錄中明確記錄下本次分支合并
如果合并出現(xiàn)沖突等,后續(xù)再說怎么解決沖突。
git log --graph 圖表形式查看
具體可以在終端輸入看看。
更改提交操作
git reset 回溯歷史版本

要讓暫存區(qū)、HEAD、當前工作樹回溯到指定狀態(tài),用
git reset --hard 指定時間的哈希值通過
git log 查找日志:
其中 commit 之后的一串字符就是哈希值
git reflog 當前倉庫執(zhí)行過的操作日志
git log 只能查看以當前狀態(tài)為終點的歷史日志,而 git reflog 可以查看當前倉庫的日志:

只要不進行垃圾回收(Garbage Collection),就可以通過日志調(diào)取近期的歷史狀態(tài)。其中前面黃色的字符串也是哈希值,哈希值只要輸入4位以上就可以了。我們可以通過哈希值回到任何歷史狀態(tài)。
解決沖突
創(chuàng)建一個分支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ǔ)操作都完成了,因為master和feature-B都修改了1.c文件,我們合并master和feature-B分支后提示我遇到?jīng)_突了:

打開1.c文件可以看到:

HEAD中的是當前的內(nèi)容,feature-B中的是feature-B的內(nèi)容,只要刪除其中一個就可以。然后加入到暫存區(qū),然后提交,我寫的提交日志為"fix conflict",下面會用到。
git commit --amend 修改提交信息
該命令是修改上一次提交的日志:

我已經(jīng)修改為如圖所示。
git rebase -i 壓縮歷史
在合并分支之前發(fā)現(xiàn)已提交的內(nèi)容有一些錯誤,不妨提交一個修改,把這個修改包含到前一個提交中,壓縮成一個歷史記錄。
創(chuàng)建一個分支feature-D,并修改1.c文件如圖:

然后加入暫存區(qū)和提交
git commti -am "日志" 一步完成這2步操作,我提交的日志為"add feature-D"。但是我提交后發(fā)現(xiàn)我拼寫錯誤,所以我們需要修改之后重新加入暫存區(qū)后再提交:
可以看到修改后提交,日志為"fix typo",用
git log 查看為:
可以通過
git rebase -i HEAD~2 來壓縮歷史記錄,其中fix typo本不應(yīng)該出現(xiàn)在歷史記錄中的,HEAD~2 是最近2次的提交記錄,顯示如圖所示信息:
可以通過把pick改為fixup然后保存提交,之后再用
git log 查看歷史記錄可以發(fā)現(xiàn)已經(jīng)沒有"fix typo" 等記錄了。
遠程倉庫的推送和獲取
推送至遠程倉庫
在GitHub上創(chuàng)建一個和本地倉庫相同的倉庫名,具體怎么創(chuàng)建倉庫請參考上一篇。
- 創(chuàng)建好遠程倉庫之后,
git remote add origin git@github.com:用戶名/倉庫名.git將它設(shè)置成本地倉庫的遠程倉庫,origin 遠程倉庫的名稱設(shè)置為該標志符 -
git push -u origin master,git push將本地倉庫的master的內(nèi)容推送到遠程倉庫。-u參數(shù)在推送同時將origin倉庫的master分支設(shè)置為本地倉庫當前分支的upstream(上游),以后運行g(shù)it pull從遠程倉庫獲取內(nèi)容時,本地倉庫的這個分支可以直接從origin的master分支獲取內(nèi)容,省去了另外添加參數(shù)。
在GitHub的結(jié)果如下:
3.也可以推送其他分支到遠程倉庫。我們試著推送feature-B到遠程倉庫
我這邊 origin 標示符,我寫的default,大家可以自己選擇。最后在GitHub上的結(jié)果為:

看,我們已經(jīng)把feature-B分支推送到GitHub上的遠程倉庫了。
oh, great!
從遠程倉庫中獲取
git clone 獲取遠程倉庫
換一個目錄,然后輸入 git clone git@github.com:用戶名/倉庫名.git 就會克隆到本地。然后輸入 git branch -a 可以查看分支,-a分支不僅可以查看本地分支也可以查看遠程的:

上面我們看到只是把master分支克隆到本地,沒有feature-B,現(xiàn)在我們獲取feature-B分支:

然后我們可以修改feature-B中1.c文件,然后:
git add 1.c
git commit -m "日志"
git push //推送到遠程倉庫
成功后可到GitHub中去查:

git pull 獲取最新遠程倉庫的分支

OK,Done!
相關(guān)
Pro Git:https://git-scm.com/book/zh/v1
LearnGitBranching:http://pcottle.github.io/learnGitBranching/
總結(jié)
至此Git相關(guān)操作都差不多介紹完了,希望通過我的介紹能讓大家對Git有基本的了解。

