1、git基本命令git
1)git init #在本地建一個git管理目錄github
2)git clone git://...git #將倉庫中的所有分支分支克隆到本地當前git管理目錄shell
3)git status #查看當前目錄中,文件的修改狀態安全
4)git add 文件名 #添加到git管理app
5)git diff #查看當前目錄全部修改過的文件(修改過尚未使用commit提交的文件)ide
6)git diff --cached #能夠查看使用add階段化後的差異svn
7) git diff branch_name #比較當前分支與branch_name分支的不一樣
fetch
7)git diff 節點號1 節點號2 #比較2個節點的不一樣ui
7)git rm 文件名 & git rm -r 文件夾 #刪除文件和文件夾spa
8)git commit --m "new version" #提交到本地庫
9)git push origin master #將本地庫同步到遠程核心庫
10) git checkout branchname #切換到某個分支或檢出一個遠程分支
11) git revert HEAD #還原最近一次提交的修改 (HEAD始終指向當前分支的當前節點)
12) git revert commit-id #還原到指定節點的修改:
13) git log -p branch_name #顯示當前分支的提交記錄,及代碼變動。
13) git log #顯示當前分支的提交記錄
origin的含義:在clone完成以後,Git 會自動爲你將此遠程倉庫命名爲origin(origin至關於一個遠程倉庫的別名,運行git remote –v或者查看.git/config能夠看到origin的含義
2、git分支管理(分支管理開發過程:http://blog.jobbole.com/25877/)
1.git branch -a 查看全部分支,包括遠程的origin/master和本地的master(origin/master是存儲在本地的遠程主分支)
2.git fetch 將遠程的代碼同步到origin/master,可是沒有合併到master分支;這一步通常不會有衝突
3.git merge 合併origin/master與master分支,可能產生衝突;也能夠用rebase,這樣能夠減小分支的出現
4.git log --oneline --graph --stat origin/master -p 查看分支的log,-p顯示修改部分
5.git difftool 比較更改
6.git checkout 檢出當前分支中的代碼到工做目錄,覆蓋工做目錄中的指定文件
(1)git checkout filename 從暫存區(cash)中檢出文件,覆蓋工做目錄中的指定文件
(2)git checkout HEAD filename 從倉庫中檢出文件,覆蓋暫存區和工做目錄.
7.reset和checkout的比較:
(1)checkout不能作commithash之間的復位
(2)一次checkout必定會改變工做目錄的內容,使得工做目錄中的內容與暫存區或與倉庫中的俄內容一致.
(3)一次reset必定會試圖改變HEAD的位置,reset以後,HEAD都會指向指定節點commithash,若是該commithash不是HEAD,那麼該commithash以後的節點將會從倉庫中被刪除.checkout是不會影響HEAD位置的.
(4)reset能夠將倉庫中的commithash還原到指定commithash;能夠將暫存區還原到倉庫中的指定commithash;能夠將工做目錄還原到倉庫中的指定commithash
git reset --hard HEAD = git checkout HEAD 檢出到本地工做目錄和暫存區
git reset HEAD 檢出到暫存區,默認爲--soft(若是暫存區有add的提交,將會被回退到unstaged狀態,工做目錄不變,這種狀況任何已有的修改都不會丟失)
git reset --hard HEAD = git reset HEAD + git checkout
(4)重點:checkout針對於每一個文件的還原;reset針對於全部文件(總體狀態)的還原
8.git diff
(1)git diff file 比較工做目錄與暫存區的不一樣
(2)git diff --cached file 比較暫存區與倉庫的不一樣
(3)git diff commithash file 比較工做目錄與倉庫的不一樣,若是時當前HEAD,那麼commithash=HEAD
(4)git diff commithash1 commithash2 file 計較任意2個commithash的不一樣
(5)git diff branchname filename 比較當前分支與指定分支的不一樣
9.git log
(1)git log brname 查看任意分支的log (有意選項:--graph --oneline)
(2)git log origin/master 查看origin/master遠程分支的log有重要的意義,能夠知道遠程分支的開發;使用fetch也是同步到該分支,不會產生衝突
(3)git log --stat HEAD 查看HEAD commithash修改過的文件有哪些
(4)git show查看文件的具體修改內容
10.分支管理
1)git branch-a 列出本地全部分支(包括隱含分支)
2)git branch -r #列出遠程全部分支
3)git branch -a #列出本地分支和遠程分支
4)git clone -b branchname https://github.com/jetty/ #克隆指定的遠程分支
5)git branch newbranchname #新建一個本地分支
6)git checkout branchname #切換到分支branchname,並將該分支檢出到工做目錄和暫存區
7)git checkout -b newbranchname #建立並切換到新分支
8)git branch -m|-M oldbranch newbranch #重命名分支,若是newbranch名字分支已經存在,則須要使用-M強制重命名,不然,使用-m進行重命名。
9)git branch -d|-D branchname #刪除[-D強制刪除]branchname分支
10)git branch -d -r branchname #刪除遠程branchname分支
11)git branch newbranch commithash #以commithash爲起點,建立新分支newbranch
12)git remote -v #查看origin對應的遠程倉庫地址
13) git remote add origin http://10.9.111.221/liujin/multiproject.git #修改origin對應的遠程分支
13)git log --oneline --decorate --graph --all #查看提交歷史、各分支指向以及分支的分叉狀況
14)git push origin : branchname#推入origin指向的遠程地址的branchname分支
15)git checkout maste -> git merge branchname#將branchname分支合入主分支,修改衝突的文件後,git add 文件 而後git commit
16)git tag -a 1.2 #打一個標籤
11.合併與提交
fetch與pull
在將本地的代碼庫合併到遠程代碼庫以前,須要作一次fetch或pull,並解決相關的衝突
1). 合併步驟
a. git fetch:至關因而從遠程獲取最新版本到本地origin/master,不會自動merge,因而不會產生衝突
git fetch origin master //首先從遠程的origin的master主分支下載最新的版本到origin/master分支上,origin/master分支是一個隱形分支
git log -p master..origin/master //而後查看遠程的log,-p顯示每次提交的代碼的修改部分
b. git merge origin/master //最後進行合併
上述過程其實能夠用如下更清晰的方式來進行:
git fetch origin master:tmp //從遠程獲取最新的版本到本地的tmp新分支上(:指取一個別名)
git diff tmp //比較當前分支與tmp分支的不一樣
git merge tmp //以後再進行比較合併,並解決衝突
git branch -d tmp //刪除臨時分支
2). git pull:至關因而從遠程獲取最新版本並merge到本地(至關於svn的update)
git pull origin master //更新遠程版本庫到本地版本庫
git pull origin branchname //拉取fork庫中的一個分支
上述命令其實至關於git fetch 和 git merge
在實際使用中,git fetch更安全一些
由於在merge前,咱們能夠查看更新狀況,而後再決定是否合併
3).merge
git merge tmp //將當前分支與tmp分支合併,若是存在衝突,那麼修改衝突所在的文件,而後使用如下命令提交修改的文件
git commit -a -m 'Resolved conflict' //提交(也能夠用add和commit 2條命令替代)
git push origin master
最後就能夠push到遠程版本庫了
在有衝突的文件中
<<<<<<<標記衝突開始,後面跟的是當前分支中的內容。
HEAD指向當前分支末梢的提交。
=======以後,>>>>>>>以前是要merge過來的另外一條分支上的代碼。
>>>>>>>以後的符號是該遠程分支的名字。
三.提交遠程版本庫與合併
fetch與pull
在將本地的代碼庫合併到遠程代碼庫以前,須要作一次fetch或pull,並解決相關的衝突
1. git fetch:至關因而從遠程獲取最新版本到本地,不會自動merge
git fetch origin master //首先從遠程的origin的master主分支下載最新的版本到origin/master分支上,origin/master分支是一個隱形分支
git log -p master..origin/master //而後查看遠程的log,-p顯示每次提交的代碼的修改部分
git merge origin/master //最後進行合併
上述過程其實能夠用如下更清晰的方式來進行:
git fetch origin master:tmp //從遠程獲取最新的版本到本地的tmp新分支上(:指取一個別名)
git diff tmp //比較當前分支與tmp分支的不一樣
git merge tmp //以後再進行比較合併,並解決衝突
git branch -d tmp //刪除臨時分支
2. git pull:至關因而從遠程獲取最新版本並merge到本地(至關於svn的update)
git pull origin master //更新遠程版本庫到本地版本庫
git pull fork源 分支 //拉取fork庫中的一個分支
上述命令其實至關於git fetch 和 git merge
在實際使用中,git fetch更安全一些
由於在merge前,咱們能夠查看更新狀況,而後再決定是否合併
3.merge
git merge tmp //將當前分支與tmp分支合併,若是存在衝突,那麼修改衝突所在的文件,而後使用如下命令提交修改的文件
git commit -a -m 'Resolved conflict' //提交(也能夠用add和commit 2條命令替代)
git push origin master
最後就能夠push到遠程版本庫了
在有衝突的文件中
<<<<<<<標記衝突開始,後面跟的是當前分支中的內容。
HEAD指向當前分支末梢的提交。
=======以後,>>>>>>>以前是要merge過來的另外一條分支上的代碼。
>>>>>>>以後的符號是該遠程分支的名字。
4、stash
git stash list [<options>] git stash show [<stash>] git stash drop [-q|--quiet] [<stash>] git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>] git stash branch <branchname> [<stash>] git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [<message>] git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [-m|--message <message>]] [--] [<pathspec>…]] git stash clear git stash create [<message>] git stash store [-m|--message <message>] [-q|--quiet] <commit>
當要記錄工做目錄和索引的當前狀態,但想要返回到乾淨的工做目錄時,則使用git stash
。 該命令保存本地修改,並恢復工做目錄以匹配HEAD
提交。
這個命令所儲藏的修改可使用git stash list
列出,使用git stash show
進行檢查,並使用git stash apply
恢復(可能在不一樣的提交之上)。調用沒有任何參數的git stash
至關於git stash save
。 默認狀況下,儲藏列表爲「分支名稱上的WIP」,但您能夠在建立一個消息時在命令行上給出更具描述性的消息。
建立的最新儲藏存儲在refs/stash
中; 這個引用的反垃圾郵件中會發現較舊的垃圾郵件,而且可使用一般的reflog
語法命名(例如,stash@{0}
是最近建立的垃圾郵件,stash@{1}
是stash@{2.hours.ago}
以前也是可能的)。也能夠經過指定存儲空間索引(例如整數n
至關於儲藏stash@{n}
)來引用鎖存。
stash apply或者pop時可能會產生衝突,須要解決衝突。產生衝突的場景:(stash保存的是當前工做空間的全部被修改未提交的文件)
stash save後,進行pull,而後apply,有可能產生衝突
在當前分支apply其它 分支save的內容,git將合併兩個文件,可能產生衝突
5、revert反轉
做用:撤銷指定的某「一次」提交,可能產生衝突。revert不會刪除原commit,只會產生一個新的commit。
# 撤銷前一次 commit
git revert HEAD
# 撤銷前前一次 commit
git revert HEAD^
# 撤回指定commit-id#好比:git revert 0818badf6882ea2664a205bc8ef3a85425bb2537
git revert commit-id
git revert 329515
這個時候git提示你有衝突要解決。咱們打開A.txt,修改衝突,並執行如下命令
git revert --continue
這個時候git會繼續撤回,若是發現衝突會繼續提示。
若是不想解決衝突的話能夠取消撤回:
git revert --abort