git詳細筆記

甄城發表於2016-04-27

git配置相關

檢視git各項配置

$ git config --list

配置使用者名稱和郵箱

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

新增暫存區

$ git add filename1 filename2 filename3 ....
$ git add .

新增版本庫

$ git commit -m"add files"

注意,commit操作只會提交已經add了的檔案,也就是已經存在暫存區中的檔案了,沒有add的檔案不會被提交

對比

$ git diff filename1

git diff 是對比上次add(暫存區)和當前修改(工作區)的對比。

diff只能監測行的改動,對行的每一個操作都會被認為刪除當前行,新加了一個不一樣的行。1 deletion(-),1 insertion(+)

簡單理解就是對比add前和add後的對比

特別注意,假如commit了,不要誤認為暫存區區就沒有內容了,diff命令就失效了,此時暫存區內仍有最近一次add的內容,所以diff命令依然會比較當前工作區和暫存區的區別

git diff:是檢視working tree與index file的差別的。
git diff –cached:是檢視index file與commit的差別的。
git diff HEAD:是檢視working tree和commit的差別的。
git diff HEAD — readme.txt 和版本庫對比
git diff — readme.txt 和暫存區對比

git diff HEAD -- readme.txt命令是對比當前工作區readme.txt檔案和版本庫中readme.txt檔案的區別,注意,這個命令跨過了暫存區進行對比

檢視日誌

完整顯示

$ git log

最近的提交在上面,最早的提交在下面

簡單顯示方式

git log --pretty=oneline

版本回退

HEAD代表當前版本,HEAD^代表上一個版本,上上個版本就是HEAD^^,依次類推,HEAD~25則是回退到上25個版本,下面命令是回退到上個版本,也可以使用git reset --hard HEAD~git reset --hard HEAD~1一樣的效果

$ git reset --hard HEAD^

也可以通過版本號的方式進行,下面就是回退到git log裡的版本號為48122212的版本

$ git reset -hard 48122212

假如有A3、A2、A1三個版,當前在A3版本,使用命令回退到了A2的版本,只要當前命令視窗沒有關閉,可以找到在git log時,顯示的A3的版本號,即可使用git reset --hard A3版本號命令“恢復”到A3的版本

不過,如果視窗關閉了也沒有事,使用如下命令,即可顯示操作的每一次命令,並且有版本號,此時應該明白如何回退了吧

$ git reflog

修改工作區後回退和add後的回退

vim readme.txt 修改
$ git checkout -- readme.txt 還原修改之前


vim readme.txt 修改
$ git add readme.txt 
$ git checkout -- readme.txt 不能還原修改之前

需要
$ git reset HEAD readme.txt 清除暫存區的add
然後再
$ git checkout -- readme.txt 還原之前修改


另外個方法
vim readme.txt 修改
$ git add readme.txt 
$ git checkout -- readme.txt 不能還原修改之前


直接
git reset --hard 版本號
直接回退到某版本號,暫存區也清空

刪除檔案回退方法(修改同理)

一、rm只刪除工作區資訊;

使用 git checkout -- file即可恢復;

二、git rm 刪除工作區和暫存區資訊;

1、使用git reset HEAD -- file即可恢復;

2、恢復步驟:

1)先使用git reset HeAD -- file從版本庫把已刪除資訊copy到到暫存區;

2)再使用git checkout -- file從暫存區把已刪除資訊copy到工作區。over!!!

3)這時你就看到刪除的檔案又回來啦。啦啦啦!

三、git commit -m “file”刪除工作區,暫存區和版本庫資訊;

1、使用git reset --hard HEAD^即可恢復或git reset HEAD^。
`特別說明`
git reset --hard HEAD^
徹底撤銷最近的提交。引用回退到前一次,而且工作區和暫存區都會回退到上一次提交的狀態。自上一次以來的提交全部丟失。
git reset HEAD^ <指定檔案,不寫即全部>
工作不改變,但是暫存區會回退到上一次提交之前,引用也會回退一次。

2、恢復步驟:
1) git reset HEAD^ <指定檔案,不寫即全部>

1)最後,使用git checkout -- file從暫存區把已刪除資訊copy到工作區。

1)這時你就看到刪除的檔案又回來啦。啦啦啦!

以上我都親自試過,很好用。

遠端庫

origin是遠端庫的預設名稱,也可以改成自己喜歡的名字,無意外,建議預設
本地庫關聯遠端庫(先有本地庫,後有遠端庫,二者要關聯)

git remote add origin 這裡換成github上的庫地址

或者克隆遠端庫到本地(本地庫沒有,直接克隆遠端庫到本地)

git clone 這裡換成github上的庫地址

修改本地庫和遠端庫的關聯

git remte origin set-url 這裡換成github上的庫地址 

master是遠端庫的名字,也是預設的,建議不動
使用關聯遠端庫的方式的推送

# `-u`的意思是關聯本地`master`和遠端庫的意思`master`
# 往後的推送命令就是用git push origin master推送即可,不需要加-u了,
# 只是第一次要加而已
git push -u origin master

使用克隆的方式的推送

git push origin master

檢視遠端庫

git remote -v

分支

Git鼓勵大量使用分支:

檢視分支:git branch

建立分支:git branch <name>

切換分支:git checkout <name>

建立+切換分支:git checkout -b <name>

此時就在分支下進行編輯,之後一樣add和commit進行操作~

合併某分支到當前分支:git merge <name>(此為快速合併Fast forward,出現衝突的時候就必須手動清除衝突了)

刪除分支:git branch -d <name>

清除衝突

建分支,add和commit切換回master,在master下merge 下dev分支報錯了,需要清除衝突!

$ git merge dev
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

檢視衝突檔案如下,HEAD代表當前分支內容,dev代表分支內容,手動去掉衝突內容或者直接全部不要寫新的內容都可以,反正要去掉<<<<====>>>>HEADdev這幾個標記

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> dev

之後再add和commit,此時分支衝突就解決了

$ git add readme.txt 
$ git commit -m "conflict fixed"
[master 59bc1cb] conflict fixed

不過不太建議使用Fast forward快速合併模式,為什麼後面說明

檢視分支情況,簡單版

git log --graph --pretty=oneline --abbrev-commit

檢視分支情況,詳細版

git log --graph

為什麼不建議使用Fast forward模式?

因為使用Fast forward快速何必模式,會丟失分支資訊,看不出做出個分支合併的操作,多人開發時,出現問題不好定位,所以merge的時候使用普通模式--no-ff
原來的git merge dev改成如下命令

git merge --no-ff -m "merge with no-ff" dev

意思是使用普通模式合併(會保留分支資訊),這樣git會merge的時候生成一個新的commit

檢視時使用下面命令,就可以看出分支合併的操作了

git log --graph --pretty=oneline --abbrev-commit

相關文章