一、git基本命令
1)git init #在本地建一個git管理目錄
2)git clone git://...git #將倉庫中的全部分支分支克隆到本地當前git管理目錄
3)git status #查看當前目錄中,文件的修改狀態
4)git add 文件名 #添加到git管理
5)git diff #查看當前目錄所有修改過的文件(修改過還沒有使用commit提交的文件)
6)git diff --cached #可以查看使用add階段化後的差別
7) git diff branch_name #比較當前分支與branch_name分支的不同
7)git diff 節點號1 節點號2 #比較2個節點的不同
7)git rm 文件名 & git rm -r 文件夾 #刪除文件和文件夾
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的含義
二、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過來的另一條分支上的代碼。
>>>>>>>之後的符號是該遠程分支的名字。
四、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將合併兩個文件,可能產生衝突
五、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