git 學習資料推薦廖雪峰https://www.liaoxuefeng.com/wiki/896043488029600
git庫所在的文件夾中的文件大致有4種狀態
-
Untracked: 未跟蹤, 此文件在文件夾中, 但並沒有加入到git庫, 不參與版本控制. 通過
git add
狀態變為Staged
. -
Unmodify: 文件已經入庫, 未修改, 即版本庫中的文件快照內容與文件夾中完全一致. 這種類型的文件有兩種去處, 如果它被修改, 而變為
Modified
. 如果使用git rm
移出版本庫, 則成為Untracked
文件 -
Modified: 文件已修改, 僅僅是修改, 並沒有進行其他的操作. 這個文件也有兩個去處, 通過
git add
可進入暫存staged
狀態, 使用git checkout
則丟棄修改過, 返回到unmodify
狀態, 這個git checkout
即從庫中取出文件, 覆蓋當前修改 -
Staged: 暫存狀態. 執行
git commit
則將修改同步到庫中, 這時庫中的文件和本地文件又變為一致, 文件為Unmodify
狀態. 執行git reset HEAD filename
取消暫存, 文件狀態為Modified
下面的圖很好的解釋了這四種狀態的轉變:

新建文件--->Untracked
使用add命令將新建的文件加入到暫存區--->Staged
使用commit命令將暫存區的文件提交到本地倉庫--->Unmodified
如果對Unmodified狀態的文件進行修改---> modified
如果對Unmodified狀態的文件進行remove操作--->Untracked
四個工作區域
Git本地有四個工作區域:工作目錄(Working Directory)、暫存區(Stage/Index)、資源庫(Repository或Git Directory)、git倉庫(Remote Directory)。文件在這四個區域之間的轉換關系如下:
Workspace: 工作區,就是你平時存放項目代碼的地方
Index / Stage: 暫存區,用於臨時存放你的改動,事實上它只是一個文件,保存即將提交到文件列表信息
Repository: 倉庫區(或版本庫),就是安全存放數據的位置,這里面有你提交到所有版本的數據。其中HEAD指向最新放入倉庫的版本
Remote: 遠程倉庫,托管代碼的服務器,可以簡單的認為是你項目組中的一台電腦用於遠程數據交換
git diff HEAD -- readme.txt
命令可以查看工作區和版本庫里面最新版本的區別,HEAD指向的是版本庫中的當前版本,而file指的是當前工作區中的文件。
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644 --- a/readme.txt +++ b/readme.txt @@ -1,4 +1,4 @@ Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage. -Git tracks changes. (版本庫) +Git tracks changes of files.(工作區)
回退本地倉庫的上個版本
$ git reset --hard HEAD^ HEAD is now at e475afc add distributed
上面的意思是,HEAD指針指向了上個版本,然后順便把工作區的文件更新了,因為是指針,所以回滾特別快
回退指定版本(只需指定commit id)
查看commit id (git log 或者 git reflog)
$ git reset --hard 1094a HEAD is now at 83b0afe append GPL
--------------
丟棄暫存區的修改(unstage),重新放回工作區git reset HEAD <file>:
$ git reset HEAD readme.txt Unstaged changes after reset: M readme.txt
然后
丟棄工作區的修改
$ git checkout -- readme.txt $ git status On branch master nothing to commit, working tree clean
---------------
git merge用法:
例如:把dev分支合並到master,先切換到master分支git switch master
用法1:git merge dev
看圖:
$ git log --graph --pretty=oneline --abbrev-commit
* 62baf1c (HEAD -> master, dev) add oo
* 1469e02 Merge branch 'dev'
|\
| * 1d33f58 without no-ff
* | c149a14 dev merge master with --no-ff
用法2:git merge --no--ff -m "merge with no-ff bb" dev
看圖:
$ git log --graph --pretty=oneline --abbrev-commit
* 270081e (HEAD -> master) merge with no-ff bb
|\
| * 3e911b1 (dev) add bb
|/
* 62baf1c add oo
* 1469e02 Merge branch 'dev'
綜述:可以從這個(1469e02)commit id看, 方法1
git merge dev是fast-foward快進模式,直接把master指針移到dev,沒有體現dev分支的merge過程
方法2git merge --no--ff -m "merge with no-ff bb" dev 禁用了快進模式,在提交歷史中可以清楚看到dev分支合並過程
git cherry-pick
作用:免做重復工作
例如:現有分支dev,master;目前需要緊急修改個bug,所以基於master分支新建hotfix分支;修復bug然后提交(這里有個commit id,“351142e”)
然后merge到master進行發布;ok,既然master有bug,dev是基於master的,所以dev也有同樣的bug;這時候你可以像改hotfix一樣手動修改,但是我們崇尚不重復工作,
這時cherry-pick就能搞定了。
git switch dev
git cherry-pick351142e
然后查看git log就能看到這個提交記錄,並在工作目錄也更新了修復內容,perfect!
git branch -D <branch name> :強行刪除一個未merge的分支
git reset --hard <commit id> :刪除已經merge的提交,其實時回滾到相應的commit id,比如回到merge之前的commit,這樣就相當於放棄了本次merge啦
git push origin master :此master為本地分支,默認時關聯遠端的master,如要推送dev分支到遠端則:git push origin dev 也可以這樣(git push -u origin dev 以后就可以簡化成這樣啦 git push但覺得不保險)
git push origin serverfix這里有些工作被簡化了。 Git 自動將 serverfix
分支名字展開為 refs/heads/serverfix:refs/heads/serverfix
, 那意味着,“推送本地的 serverfix
分支來更新遠程倉庫上的 serverfix
分支。
如果並不想讓遠程倉庫上的分支叫做 serverfix
,可以運行 git push origin serverfix:awesomebranch
來將本地的 serverfix
分支推送到遠程倉庫上的 awesomebranch
分支。
git push <遠程主機名> <本地分支名>:<遠程分支名>
git push origin master :此master為本地分支
git pull <遠程主機名> <遠程分支名>:<本地分支名>
git pull origin master :此master為遠程分支
git rebase
rebase的目的是使得我們在查看歷史提交的變化時更容易,因為分叉的提交需要三方對比。
rebase操作可以把本地未push的分叉提交歷史整理成直線;
git checkout -b dev origin/dev
一般來說
在目錄下用git clone git@github.com:xxxxx/yyyyy.git
接着要查看下本地的當前分支嘛
git branch
你會看到你在master分支下
這個時候往往會用git checkout -b dev origin/dev這個命令
它意思是說.切換到dev分支上,接着跟遠程的origin地址上的dev分支關聯起來,這里要注意origin代表是一個路徑,可以用git remote -v 查看
說來白了,origin/dev有點像是git@github.com:xxxxx/yyyyy.git/dev
接着在dev當前分支下進行操作,add,commit后,用git push origin dev,意思是推送當前的dev分支到遠程origin地址的dev分支上
創建名為newbranch的分支
git checkout -b newbranch start_point
start_point是當前分支commit的點,一般是當前的HEAD,一般也不寫 git checkout -b newbranch
git log 就可以對比commit內容