昨天在同事電腦上操作了一把cherry-pick代碼,發現很多功能不用,就慢慢忘記了,梳理了下流程圖:
git commit --amend ? 前提是沒push
cherry-pick [commit
git branch -r --contains cfc3521a32bd
git ?blame [fiel] 看具體修改
Git使用由淺入深
本地有一個項目,要使用git管理,在項目的根目錄git init
修改的文件我要添加 使用git add《file》再使用git commit提交到本地
當自己寫完一段程序,完成一個功能,看自己修改了哪些東西,使用git status,
如果想看具體自己修改了哪些,可以使用git diff《file》
HEAD指向的版本就是當前版本,因此,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:增加網絡請求和響應處理的類
·f7c8d7bHEAD@{5}: commit:增加了數據庫,和基本的配置
·2acbe01HEAD@{6}: clone: from https://github.com/zh2016hz/coo-weather.git
·(END)
################################
在github上創建一個倉庫,然后進到本地的項目中,使用:
git??clonehttps://github.com/zh2016hz/Mygittest.git
這個完成后,在你的本地項目中會多出一個文件夾:你GitHub上倉庫的名字,然后打開你會發現比你倉庫中多出一個文件,這里有個隱藏的文件,需要你現實自己電腦隱藏的文件,全選這幾個文件,復制,粘貼到外面一層目錄,會提示你.gitignore文件是隱藏的不能替換,那你就先把外層的這個文件刪除了,在替換過去,替換完了把這個剛才多出來的文件夾刪除就好,然后你在本地項目根目錄,輸入gitbranch就能看到當前在master分支上,你就可以開始了!
.gitignore文件中一般加如下就可以了:
```
/build
/.gradle
/.idea
local.properties
*.iml
*.orig
*.pyc
```
一般我們不在master分支上開發,新建一個dev分支并把新建的分支推到遠端
?GitTestgit:(master)?git branch dev
?GitTestgit:(master)?git push origin
這個時候做第一次修改,然后看修改狀態,提交
add是把這些文件都放到寄存區,stage然后通過commit提交到默認的master分支
第一次修改->?git add?->第二次修改->?git commit
你看,我們前面講了,Git管理的是修改,當你用git add命令后,在工作區的第一次修改被放入暫存區,準備提交,但是,在工作區的第二次修改并沒有放入暫存區,所以,git commit只負責把暫存區的修改提交了,也就是第一次的修改被提交了,第二次的修改不會被提交。
提交后,用git diff HEAD -- readme.txt命令可以查看工作區和版本庫里面最新版本
現在你有兩個選擇,一是確實要從版本庫中刪除該文件,那就用命令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
現在,文件就從版本庫中被刪除了。
另一種情況是刪錯了,因為版本庫里還有呢,所以可以很輕松地把誤刪的文件恢復到最新版本:
$git checkout -- test.txt(這個方法其實不行)
git checkout其實是用版本庫里的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
小結
命令git rm用于刪除一個文件。如果一個文件已經被提交到版本庫,那么你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交后你修改的內容。
要克隆一個倉庫,首先必須知道倉庫的地址,然后使用git clone命令克隆。
Git支持多種協議,包括https,但通過ssh支持的原生git協議速度最快
################################
git下創建文件夾mkdir創建文件mkfile -n 1024 test.txt???1024是字節數
刪除:
rm -rf three20
http://www.flutterstudio.com/internet/2610.html
rm刪除命令。即remove的縮寫,它后面有兩個參數。
-r刪除文件夾內的子文件夾及內容,一般情況下rm只能刪除文件或者空的文件夾。
-f強制刪除參數
如果需要了解rm命令的更多參數。請輸入:man rm
我們創建dev分支,然后切換到dev分支:
$git checkout -b dev創建并切換到這個分支
Switchedto a new branch'dev'
git checkout命令加上-b參數表示創建并切換,相當于以下兩條命令:
$git branch dev
$git checkout dev
Switchedto branch'dev'
然后,用git branch命令查看當前分支:
$git branch
* dev
master
git branch命令會列出所有分支,當前分支前面會標一個*號。
然后,我們就可以在dev分支上正常提交,比如對readme.txt做個修改,加上一行:
Creating anewbranch is quick.
然后提交:
$git add readme.txt
$git commit -m"branch test"
[dev fec145a] branch test
1file changed,1insertion(+)
現在,dev分支的工作完成,我們就可以切換回master分支:
$git checkout master
Switchedto branch'master'
切換回master分支后,再查看一個readme.txt文件,剛才添加的內容不見了!因為那個提交是在dev分支上,而master分支此刻的提交點并沒有變:
現在,我們把dev分支的工作成果合并到master分支上:
$git merge dev前提是我要切換到原始分支,這個合并后在本地,,還需要推到遠端,倉庫才能看到改變
Updatingd17efd8..fec145a
Fast-forward
readme.txt |1+
1file changed,1insertion(+)
git merge命令用于合并指定分支到當前分支。合并后,再查看readme.txt的內容,就可以看到,和dev分支的最新提交是完全一樣的。
注意到上面的Fast-forward信息,Git告訴我們,這次合并是“快進模式”,也就是直接把master指向dev的當前提交,所以合并速度非常快。
當然,也不是每次合并都能Fast-forward,我們后面會講其他方式的合并。
合并完成后,就可以放心地刪除dev分支了:
$git branch -d dev
Deletedbranch dev (was fec145a).
刪除后,查看branch,就只剩下master分支了:
$git branch
* master
因為創建、合并和刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,合并后再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。
小結
Git鼓勵大量使用分支:
查看分支:git branch
創建分支:git branch
切換分支:git checkout
創建+切換分支:git checkout -b
合并某分支到當前分支: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
以上的區別就是d會判斷當前分支是否合并,如果存在沒有合并的,則不允許刪除,—D就是暴力刪除,這個要慎用
1.1刪除分支。遠程:git push origin :test1
1.2刪除本地: git branch -d XX
分支名沒有起好,如何改名字?
三部曲:
第一:從本地該分支建一個要重新命名的新分支;
第二:將該分支推送到中央倉庫;
第三:刪除原來的原創分支;
如何在已有的tag上拉取分支:
1.在A項目的tag上,使用git ?branch ?test1??,再git ?branch而不是git ?branch -a能看到新建的分支,然后在git checkout到對應的分支上,再使用git push -u origin test1提交到服務器,成功后使用git log查看提交,現在在新建的test1分支上拉代碼就好了
基于某個分支拉取分支:git???branch??B??dev
基于tag拉取分支是一樣的
針對多模塊使用git status需要進到各個目錄下
在終端control+R可以查詢使用過的命令
比如我輸入:./fmanager pull則比配出./fmanager pull && cd FFProject && pod install
開發過程中,你可能會遇到有一個tag我不知道他是在那個tag上打的tag ,使用下面的方式:
查找tag所在分支
git branch -r --contains commitid
git branch -r --contains tagname
把本地tag推送到遠端:git push –tags
git fetch origin tag
Workspace:工作區Index/Stage:暫存區Repository:本地倉庫Remote:遠程倉庫
查看git的配置表#查看當前git倉庫配置表
git config --list
#查看全局git倉庫配置表git config --global --list
其實還有一種方式可以初始化倉庫:
1.git init
關聯遠程倉庫:git remote add origingit@10.20.11.218:FFProject/App_Android.git
檢出倉庫
git clone git@10.20.11.218:FFProject/App_Android.git
ignore忽件
將需要加版本記錄的件,進ignore操作。需要在倉庫錄下建個.gitignore件(其與.git是平級的)配置語法:
增加/刪除件
添加指定件到暫存區git add [file1] [file2] ...
#添加指定錄到暫存區,包括錄git add [dir]
#添加當前錄的所有件到暫存區git add .
#交互式添加改動到暫存區git add -p
#刪除作區件,并且將這次刪除放暫存區git rm [file1] [file2] ...
#停追蹤指定件,但該件會保在作區git rm --cached [file]
#重命名名件,并且將這個重命名放暫存區git mv [file-original] [file-renamed]
提交暫存區到倉庫區git commit -m [message]
#提交暫存區的指定件到倉庫區git commit [file1] [file2] ... -m [message]
#提交作區上次commit之后的變化,直接到倉庫區git commit -am [message]
#提交時顯示所有diff信息git commit -v
#使次新的commit,替代上次提交#如果代碼沒有任何新變化,則來改寫上次commit的提交信息git commit --amend -m [message]
#重做上次commit,并包括指定件的新變化git commit --amend
提交暫存區到倉庫區git commit -m [message]
#提交暫存區的指定件到倉庫區git commit [file1] [file2] ... -m [message]
#提交作區上次commit之后的變化,直接到倉庫區git commit -am [message]
#提交時顯示所有diff信息git commit -v
#使次新的commit,替代上次提交#如果代碼沒有任何新變化,則來改寫上次commit的提交信息git commit --amend -m [message]
#重做上次commit,并包括指定件的新變化git commit --amend
出所有tag git tag
#新建個tag在當前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
#顯示當前分的版本歷史git log
#顯示commit歷史,以及每次commit發變的件git log --stat
#顯示某個件的版本歷史,包括件改名git log --follow [file]git whatchanged [file]
#顯示指定件相關的每次diff git log -p [file]
#顯示指定件每的最后修改和時間git blame [file]
#顯示暫存區和作區的差異git diff
#顯示暫存區和上個commit的差異git diff --cached []
#顯示作區與當前分最新commit之間的差異git diff HEAD
#顯示兩次提交之間的差異git diff [first-branch]...[second-branch]
#顯示某次提交的元數據和內容變化git show [commit]
#顯示某次提交發變化的件git show --name-only [commit]
#顯示某次提交時,某個件的內容git show [commit]:[filename]
#顯示當前作區的操作歷史git reflog
拉取遠程倉庫的所有變動(影響作空間) git fetch [remote]
#顯示所有遠程倉庫git remote -v
#顯示某個遠程倉庫的信息git remote show [remote]
#增加個新的遠程倉庫,并命名git remote add [shortname] [url]
#取回遠程倉庫的變化,并與本地分合并(pull = fetch + merge) git pull [remote] [branch]
#上傳本地指定分到遠程倉庫git push [remote] [branch]
#強推送當前分到遠程倉庫,即使有沖突git push [remote] --force
#推送所有分到遠程倉庫git push [remote] --all
撤銷
git? checkout 46bce36e60669dec51968a0f7d1f867a5451511d app/src/main/java/com/example/aa/gittest/MainActivity.java
可以回到mainactivity在46。。。。這次提交的樣子!很實用!
恢復暫存區的指定件到作區git checkout [file]
#恢復某個commit的指定件到作區git checkout [commit] [file]
恢復上個commit的所有件到作區git checkout .
#重置暫存區的指定件,與上次commit保持致,但作區變git reset [file]
#重置暫存區與作區,與上次commit保持致git reset --hard
#重置當前分的指針為指定commit,同時重置暫存區,但作區變git reset [commit]
#重置當前分的HEAD為指定commit,同時重置暫存區和作區,與指定commit致git reset --hard [commit]
#重置當前HEAD為指定commit,但保持暫存區和作區變git reset --keep [commit]
#新建個commit,來撤銷指定commit#后者的所有變化都將被前者抵消,并且應到當前分git revert [commit]
vim? test.txt保存退出:按esc再輸入:wq
rebase,先找到experiment和master共同節點c2#從experiment分c2后的所有commit(c4),砍掉后在master上進衍變為c4' git checkout experimentgit rebase master
# rebase的過程個個commit進衍變的#如遇沖突,會個個接著提示,解決沖突后git add [conflic-files]git rebase --continue
#如果接下來還有沖突,解決沖突后,重復上的操作,直到所有的沖突解決完畢git add [conflic-files]git rebase --continue
#如果沖突太多,想合并,可以使以下命令終合并,回滾操作git rebase --abort
總結merge會成次merge commit,merge commit是個雙親節點rebase會保持log在條線上,但是會改變提交歷史(c4和c4'的commit id樣)如遇沖突,merge會要求次性解決所有沖突,rebase則要求個個解決沖突
需要注意的是,push出去的commit,允許進rebase,原因就是因為它的commit id會改變
最后,在看下三個:
1.git cherry-pick ?XX
git cherry-pick ? 然后還要記得push
2.查看當前log 是在那個分支拉取的(有的時候可能不能顯示,但是我在公司項目中能實現)
3.reset XXX 還原本地,還原遠程的:
git reset --hard 684907fc96e48c93c625c56398e283bd1d0f67d8
git? commit -m"XXXX? "? --no-verify ?跳過代碼檢查;