昨天在同事電腦上操作了一把cherry-pick代碼,發(fā)現(xiàn)很多功能不用,就慢慢忘記了,梳理了下流程圖:
git commit --amend ? 前提是沒push
cherry-pick [commit
git branch -r --contains cfc3521a32bd
git ?blame [fiel] 看具體修改
Git使用由淺入深
本地有一個項目桃犬,要使用git管理,在項目的根目錄git init
修改的文件我要添加 使用git add《file》再使用git commit提交到本地
當(dāng)自己寫完一段程序评肆,完成一個功能域醇,看自己修改了哪些東西奋早,使用git status兜粘,
如果想看具體自己修改了哪些绞绒,可以使用git diff《file》
HEAD指向的版本就是當(dāng)前版本拦耐,因此耕腾,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
·穿梭前杀糯,用git log可以查看提交歷史扫俺,以便確定要回退到哪個版本。
·要重返未來火脉,用git reflog查看命令歷史牵舵,以便確定要回到未來的哪個版本
·d68bbfdHEAD@{0}: commit:
·4a29787HEAD@{1}: commit:宇涵天氣了
·4a0a6fdHEAD@{2}: commit:天氣基本搞完了
·6c0d46aHEAD@{3}: commit:增加fragment及部分文件
·30687b6HEAD@{4}: commit:增加網(wǎng)絡(luò)請求和響應(yīng)處理的類
·f7c8d7bHEAD@{5}: commit:增加了數(shù)據(jù)庫柒啤,和基本的配置
·2acbe01HEAD@{6}: clone: from https://github.com/zh2016hz/coo-weather.git
·(END)
################################
在github上創(chuàng)建一個倉庫,然后進(jìn)到本地的項目中畸颅,使用:
git??clonehttps://github.com/zh2016hz/Mygittest.git
這個完成后担巩,在你的本地項目中會多出一個文件夾:你GitHub上倉庫的名字,然后打開你會發(fā)現(xiàn)比你倉庫中多出一個文件没炒,這里有個隱藏的文件涛癌,需要你現(xiàn)實自己電腦隱藏的文件,全選這幾個文件送火,復(fù)制拳话,粘貼到外面一層目錄,會提示你.gitignore文件是隱藏的不能替換种吸,那你就先把外層的這個文件刪除了弃衍,在替換過去,替換完了把這個剛才多出來的文件夾刪除就好,然后你在本地項目根目錄坚俗,輸入gitbranch就能看到當(dāng)前在master分支上镜盯,你就可以開始了!
.gitignore文件中一般加如下就可以了:
```
/build
/.gradle
/.idea
local.properties
*.iml
*.orig
*.pyc
```
一般我們不在master分支上開發(fā)猖败,新建一個dev分支并把新建的分支推到遠(yuǎn)端
?GitTestgit:(master)?git branch dev
?GitTestgit:(master)?git push origin
這個時候做第一次修改速缆,然后看修改狀態(tài),提交
add是把這些文件都放到寄存區(qū)恩闻,stage然后通過commit提交到默認(rèn)的master分支
第一次修改->?git add?->第二次修改->?git commit
你看艺糜,我們前面講了,Git管理的是修改幢尚,當(dāng)你用git add命令后破停,在工作區(qū)的第一次修改被放入暫存區(qū),準(zhǔn)備提交侠草,但是辱挥,在工作區(qū)的第二次修改并沒有放入暫存區(qū),所以边涕,git commit只負(fù)責(zé)把暫存區(qū)的修改提交了晤碘,也就是第一次的修改被提交了,第二次的修改不會被提交功蜓。
提交后园爷,用git diff HEAD -- readme.txt命令可以查看工作區(qū)和版本庫里面最新版本
現(xiàn)在你有兩個選擇,一是確實要從版本庫中刪除該文件式撼,那就用命令git rm刪掉童社,并且git commit:
$ git rm test.txt
rm 'test.txt'
$ gitcommit-m"remove test.txt"
[master d17efd8] remove test.txt
1file changed,1deletion(-)
deletemode100644test.txt
現(xiàn)在,文件就從版本庫中被刪除了著隆。
另一種情況是刪錯了扰楼,因為版本庫里還有呢呀癣,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本:
$git checkout -- test.txt(這個方法其實不行)
git checkout其實是用版本庫里的版本替換工作區(qū)的版本,無論工作區(qū)是修改還是刪除弦赖,都可以“一鍵還原”项栏。
小結(jié)
命令git rm用于刪除一個文件。如果一個文件已經(jīng)被提交到版本庫蹬竖,那么你永遠(yuǎn)不用擔(dān)心誤刪沼沈,但是要小心,你只能恢復(fù)文件到最新版本币厕,你會丟失最近一次提交后你修改的內(nèi)容列另。
要克隆一個倉庫,首先必須知道倉庫的地址旦装,然后使用git clone命令克隆页衙。
Git支持多種協(xié)議,包括https同辣,但通過ssh支持的原生git協(xié)議速度最快
################################
git下創(chuàng)建文件夾mkdir創(chuàng)建文件mkfile -n 1024 test.txt???1024是字節(jié)數(shù)
刪除:
rm -rf three20
http://www.flutterstudio.com/internet/2610.html
rm刪除命令拷姿。即remove的縮寫,它后面有兩個參數(shù)旱函。
-r刪除文件夾內(nèi)的子文件夾及內(nèi)容,一般情況下rm只能刪除文件或者空的文件夾描滔。
-f強(qiáng)制刪除參數(shù)
如果需要了解rm命令的更多參數(shù)棒妨。請輸入:man rm
我們創(chuàng)建dev分支,然后切換到dev分支:
$git checkout -b dev創(chuàng)建并切換到這個分支
Switchedto a new branch'dev'
git checkout命令加上-b參數(shù)表示創(chuàng)建并切換含长,相當(dāng)于以下兩條命令:
$git branch dev
$git checkout dev
Switchedto branch'dev'
然后券腔,用git branch命令查看當(dāng)前分支:
$git branch
* dev
master
git branch命令會列出所有分支,當(dāng)前分支前面會標(biāo)一個*號拘泞。
然后纷纫,我們就可以在dev分支上正常提交,比如對readme.txt做個修改陪腌,加上一行:
Creating anewbranch is quick.
然后提交:
$git add readme.txt
$git commit -m"branch test"
[dev fec145a] branch test
1file changed,1insertion(+)
現(xiàn)在辱魁,dev分支的工作完成,我們就可以切換回master分支:
$git checkout master
Switchedto branch'master'
切換回master分支后诗鸭,再查看一個readme.txt文件染簇,剛才添加的內(nèi)容不見了!因為那個提交是在dev分支上强岸,而master分支此刻的提交點并沒有變:
現(xiàn)在锻弓,我們把dev分支的工作成果合并到master分支上:
$git merge dev前提是我要切換到原始分支,這個合并后在本地,蝌箍,還需要推到遠(yuǎn)端青灼,倉庫才能看到改變
Updatingd17efd8..fec145a
Fast-forward
readme.txt |1+
1file changed,1insertion(+)
git merge命令用于合并指定分支到當(dāng)前分支暴心。合并后,再查看readme.txt的內(nèi)容杂拨,就可以看到专普,和dev分支的最新提交是完全一樣的。
注意到上面的Fast-forward信息扳躬,Git告訴我們脆诉,這次合并是“快進(jìn)模式”,也就是直接把master指向dev的當(dāng)前提交贷币,所以合并速度非郴魇ぃ快。
當(dāng)然役纹,也不是每次合并都能Fast-forward偶摔,我們后面會講其他方式的合并。
合并完成后促脉,就可以放心地刪除dev分支了:
$git branch -d dev
Deletedbranch dev (was fec145a).
刪除后辰斋,查看branch,就只剩下master分支了:
$git branch
* master
因為創(chuàng)建瘸味、合并和刪除分支非彻蹋快,所以Git鼓勵你使用分支完成某個任務(wù)旁仿,合并后再刪掉分支藕夫,這和直接在master分支上工作效果是一樣的,但過程更安全枯冈。
小結(jié)
Git鼓勵大量使用分支:
查看分支:git branch
創(chuàng)建分支:git branch
切換分支:git checkout
創(chuàng)建+切換分支:git checkout -b
合并某分支到當(dāng)前分支:git merge
刪除分支:git branch -d
########
git??stash——》git stash pop
1.git config user.name xxxx:(xxxx)
2.git config user.email xxxx@gmail.com:配置自己郵箱
刪除分支:
git branch -d
git ?branch -D
以上的區(qū)別就是d會判斷當(dāng)前分支是否合并毅贮,如果存在沒有合并的,則不允許刪除尘奏,—D就是暴力刪除滩褥,這個要慎用
1.1刪除分支。遠(yuǎn)程:git push origin :test1
1.2刪除本地: git branch -d XX
分支名沒有起好炫加,如何改名字瑰煎?
三部曲:
第一:從本地該分支建一個要重新命名的新分支;
第二:將該分支推送到中央倉庫琢感;
第三:刪除原來的原創(chuàng)分支丢间;
如何在已有的tag上拉取分支:
1.在A項目的tag上,使用git ?branch ?test1??,再git ?branch而不是git ?branch -a能看到新建的分支驹针,然后在git checkout到對應(yīng)的分支上烘挫,再使用git push -u origin test1提交到服務(wù)器,成功后使用git log查看提交,現(xiàn)在在新建的test1分支上拉代碼就好了
基于某個分支拉取分支:git???branch??B??dev
基于tag拉取分支是一樣的
針對多模塊使用git status需要進(jìn)到各個目錄下
在終端control+R可以查詢使用過的命令
比如我輸入:./fmanager pull則比配出./fmanager pull && cd FFProject && pod install
開發(fā)過程中,你可能會遇到有一個tag我不知道他是在那個tag上打的tag ,使用下面的方式:
查找tag所在分支
git branch -r --contains commitid
git branch -r --contains tagname
把本地tag推送到遠(yuǎn)端:git push –tags
git fetch origin tag
Workspace:工作區(qū)Index/Stage:暫存區(qū)Repository:本地倉庫Remote:遠(yuǎn)程倉庫
查看git的配置表#查看當(dāng)前git倉庫配置表
git config --list
#查看全局git倉庫配置表git config --global --list
其實還有一種方式可以初始化倉庫:
1.git init
關(guān)聯(lián)遠(yuǎn)程倉庫:git remote add origingit@10.20.11.218:FFProject/App_Android.git
檢出倉庫
git clone git@10.20.11.218:FFProject/App_Android.git
ignore忽件
將需要加版本記錄的件,進(jìn)ignore操作饮六。需要在倉庫錄下建個.gitignore件(其與.git是平級的)配置語法:
增加/刪除件
添加指定件到暫存區(qū)git add [file1] [file2] ...
#添加指定錄到暫存區(qū),包括錄git add [dir]
#添加當(dāng)前錄的所有件到暫存區(qū)git add .
#交互式添加改動到暫存區(qū)git add -p
#刪除作區(qū)件,并且將這次刪除放暫存區(qū)git rm [file1] [file2] ...
#停追蹤指定件,但該件會保在作區(qū)git rm --cached [file]
#重命名名件,并且將這個重命名放暫存區(qū)git mv [file-original] [file-renamed]
提交暫存區(qū)到倉庫區(qū)git commit -m [message]
#提交暫存區(qū)的指定件到倉庫區(qū)git commit [file1] [file2] ... -m [message]
#提交作區(qū)上次commit之后的變化,直接到倉庫區(qū)git commit -am [message]
#提交時顯示所有diff信息git commit -v
#使次新的commit,替代上次提交#如果代碼沒有任何新變化,則來改寫上次commit的提交信息git commit --amend -m [message]
#重做上次commit,并包括指定件的新變化git commit --amend
提交暫存區(qū)到倉庫區(qū)git commit -m [message]
#提交暫存區(qū)的指定件到倉庫區(qū)git commit [file1] [file2] ... -m [message]
#提交作區(qū)上次commit之后的變化,直接到倉庫區(qū)git commit -am [message]
#提交時顯示所有diff信息git commit -v
#使次新的commit,替代上次提交#如果代碼沒有任何新變化,則來改寫上次commit的提交信息git commit --amend -m [message]
#重做上次commit,并包括指定件的新變化git commit --amend
出所有tag git tag
#新建個tag在當(dāng)前commit git tag [tag]
#新建個tag在指定commit git tag [tag] [commit]
#查看tag信息git show [tag]
#提交指定taggit push [remote] [tag]
#提交所有taggit push [remote] --tags
#新建個分,指向某個taggit checkout -b [branch] [tag]
顯示有變的件git status
#顯示當(dāng)前分的版本歷史git log
#顯示commit歷史,以及每次commit發(fā)變的件git log --stat
#顯示某個件的版本歷史,包括件改名git log --follow [file]git whatchanged [file]
#顯示指定件相關(guān)的每次diff git log -p [file]
#顯示指定件每的最后修改和時間git blame [file]
#顯示暫存區(qū)和作區(qū)的差異git diff
#顯示暫存區(qū)和上個commit的差異git diff --cached []
#顯示作區(qū)與當(dāng)前分最新commit之間的差異git diff HEAD
#顯示兩次提交之間的差異git diff [first-branch]...[second-branch]
#顯示某次提交的元數(shù)據(jù)和內(nèi)容變化git show [commit]
#顯示某次提交發(fā)變化的件git show --name-only [commit]
#顯示某次提交時,某個件的內(nèi)容git show [commit]:[filename]
#顯示當(dāng)前作區(qū)的操作歷史git reflog
拉取遠(yuǎn)程倉庫的所有變動(影響作空間) git fetch [remote]
#顯示所有遠(yuǎn)程倉庫git remote -v
#顯示某個遠(yuǎn)程倉庫的信息git remote show [remote]
#增加個新的遠(yuǎn)程倉庫,并命名git remote add [shortname] [url]
#取回遠(yuǎn)程倉庫的變化,并與本地分合并(pull = fetch + merge) git pull [remote] [branch]
#上傳本地指定分到遠(yuǎn)程倉庫git push [remote] [branch]
#強(qiáng)推送當(dāng)前分到遠(yuǎn)程倉庫,即使有沖突git push [remote] --force
#推送所有分到遠(yuǎn)程倉庫git push [remote] --all
撤銷
git? checkout 46bce36e60669dec51968a0f7d1f867a5451511d app/src/main/java/com/example/aa/gittest/MainActivity.java
可以回到mainactivity在46其垄。。卤橄。绿满。這次提交的樣子!很實用窟扑!
恢復(fù)暫存區(qū)的指定件到作區(qū)git checkout [file]
#恢復(fù)某個commit的指定件到作區(qū)git checkout [commit] [file]
恢復(fù)上個commit的所有件到作區(qū)git checkout .
#重置暫存區(qū)的指定件,與上次commit保持致,但作區(qū)變git reset [file]
#重置暫存區(qū)與作區(qū),與上次commit保持致git reset --hard
#重置當(dāng)前分的指針為指定commit,同時重置暫存區(qū),但作區(qū)變git reset [commit]
#重置當(dāng)前分的HEAD為指定commit,同時重置暫存區(qū)和作區(qū),與指定commit致git reset --hard [commit]
#重置當(dāng)前HEAD為指定commit,但保持暫存區(qū)和作區(qū)變git reset --keep [commit]
#新建個commit,來撤銷指定commit#后者的所有變化都將被前者抵消,并且應(yīng)到當(dāng)前分git revert [commit]
vim? test.txt保存退出:按esc再輸入:wq
rebase,先找到experiment和master共同節(jié)點c2#從experiment分c2后的所有commit(c4),砍掉后在master上進(jìn)衍變?yōu)閏4' git checkout experimentgit rebase master
# rebase的過程個個commit進(jìn)衍變的#如遇沖突,會個個接著提示,解決沖突后git add [conflic-files]git rebase --continue
#如果接下來還有沖突,解決沖突后,重復(fù)上的操作,直到所有的沖突解決完畢git add [conflic-files]git rebase --continue
#如果沖突太多,想合并,可以使以下命令終合并,回滾操作git rebase --abort
總結(jié)merge會成次merge commit,merge commit是個雙親節(jié)點rebase會保持log在條線上,但是會改變提交歷史(c4和c4'的commit id樣)如遇沖突,merge會要求次性解決所有沖突,rebase則要求個個解決沖突
需要注意的是,push出去的commit,允許進(jìn)rebase,原因就是因為它的commit id會改變
最后喇颁,在看下三個:
1.git cherry-pick ?XX
git cherry-pick ? 然后還要記得push
2.查看當(dāng)前l(fā)og 是在那個分支拉取的(有的時候可能不能顯示,但是我在公司項目中能實現(xiàn))
3.reset XXX 還原本地嚎货,還原遠(yuǎn)程的:
git reset --hard 684907fc96e48c93c625c56398e283bd1d0f67d8
git? commit -m"XXXX? "? --no-verify ?跳過代碼檢查橘霎;