
https://www.cnblogs.com/ximiaomiao/p/7140456.html
1.?
現(xiàn)在當(dāng)前文件夾創(chuàng)建readme.txt文件,進(jìn)行修改后。
git add <文件名>? ? ? ? ? ? ? //比如? git add readme.txt? ? ? 會(huì)更新
git commit -m <備注說(shuō)明>? ? //? 比如? git commit -m "添加了readme.txt"? ? ? ? 會(huì)提交修改后的文件
2.?
再次編輯readme.txt? 在句末加入!!!
git status? ? //會(huì)顯示哪些文件被修改了
git diff readme.txt? ? ? //顯示具體修改了什么
修改后 再次
git add readme.txt?
git commit -m "balabala"
3.
git log? ? //查看commit提交記錄
一長(zhǎng)串的commit id(版本號(hào)) 用來(lái)記錄該次commit的id號(hào),回退時(shí)經(jīng)常用到,
4. 版本回退
HEAD表示當(dāng)前版本 HEAD^表示上個(gè)版本 HEAD^^上上個(gè)版本
HEAD始終指向一個(gè)當(dāng)前分支(正在操作的分支),比如master ,dev等
git reset --hard 1049a? ? //指定到版本號(hào)前幾位是1049a的版本 具體取幾位隨意 git log查看版本號(hào)
git reset --hard HEAD^? ? //退回到上個(gè)版本
git relog? //查看歷史版本號(hào) 即使關(guān)機(jī)再打開(kāi)也能顯示 這樣回退之后后悔了,可以查看沒(méi)回退的時(shí)候是什么版本號(hào)
5.工作區(qū)和暫存區(qū)
git add file.txt? 負(fù)責(zé)把對(duì)file.txt做出的修改提交到緩存區(qū)(index),而不是把文件提交。
git commit? 負(fù)責(zé)把緩存區(qū)的內(nèi)容交給分支。
如果對(duì)文件修改后只commit 而不add 則實(shí)際上沒(méi)有成功提交修改。因?yàn)榫彺鎱^(qū)的內(nèi)容空的。
6.撤銷(xiāo)操作
git checkout -- file.txt? ? ? ? //撤銷(xiāo)對(duì)工作區(qū)文件file.txt的修改
如果文件已經(jīng)提交到緩存區(qū)
git reset HEAD file.txt? ? //撤銷(xiāo)把文件add進(jìn)緩存區(qū)的操作
再 git checkout --file.txt 撤銷(xiāo)工作區(qū)對(duì)文件的修改
7.刪除文件
工作區(qū)的文件可以直接刪除,若還要?jiǎng)h除版本庫(kù)的文件
用 git rm file.txt? ?
再 git commit -m "刪除了file.txt文件"
如果誤刪了工作區(qū)文件 可以 git checkout --file.txt? 即把版本庫(kù)的file.txt文件送到工作區(qū)
8.? 給github添加ssh key? 和? 新建遠(yuǎn)程倉(cāng)庫(kù)
push命令:$ git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
將現(xiàn)有倉(cāng)庫(kù)推送到遠(yuǎn)程倉(cāng)庫(kù)
git remote add origin https://github.com/cdatm/test_git_work.git? ? //origin是遠(yuǎn)程倉(cāng)庫(kù)名稱(chēng)
或者使用? git remote add origin git@github.com:cdatm/test_git_work.git? //使用的ssh協(xié)議 比https的更快
git push -u origin master? ? //將本地的master分支推送到origin主機(jī),-u參數(shù) 指定origin為默認(rèn)主機(jī),后面就可以不? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //加任何參數(shù)使用git push了
git push origin master:ppt? //將本地分支master推送到遠(yuǎn)程倉(cāng)庫(kù),給對(duì)應(yīng)的遠(yuǎn)程分支取名為ppt
git push origin :ppt? //推送空的本地分支到遠(yuǎn)程分支ppt ,即刪除ppt分支
當(dāng)多人合作時(shí),隨著其他人的提交,遠(yuǎn)程分支的commit進(jìn)度和本地的可能不一樣。注意最初克隆時(shí)會(huì)在本地產(chǎn)生一個(gè)origin/master分支,不可改動(dòng),始終指向克隆那一刻的遠(yuǎn)程倉(cāng)庫(kù)的master指向的commit。

可以運(yùn)行 git fetch origin 來(lái)同步遠(yuǎn)程服務(wù)器上的數(shù)據(jù)到本地。該命令首先找到 origin 是哪個(gè)服務(wù)器(本例為 git.ourcompany.com),從上面獲取你尚未擁有的數(shù)據(jù),更新你本地的數(shù)據(jù)庫(kù),然后把 origin/master 的指針移到它最新的位置上

git fetch //根據(jù)遠(yuǎn)程倉(cāng)庫(kù) 更新所有本地分支
git fetch origin master // 將origin上的master分支更新到本地分支上,即會(huì)在本地更新origin/master分支
更新后為了在origin/master基礎(chǔ)上開(kāi)發(fā) 可以新建本地分支
git checkout -b dev1 origin/master
或者直接合并
git merge origin/master
9.遠(yuǎn)程克隆
把遠(yuǎn)程的庫(kù)克隆到本地倉(cāng)庫(kù)
git clone git@github.com:cdatm/git_clone_test.git? //這樣本地目錄就會(huì)存在一個(gè)git_clone_test庫(kù)
或者 git clone https://github.com/cdatm/git_clone_test.git?
一次 Git 克隆會(huì)建立你自己的本地分支 master 和遠(yuǎn)程分支 origin/master,并且將它們都指向 origin 上的 master 分支。但不能修改本地的遠(yuǎn)程分支origin/master .
10.分支管理
(1)創(chuàng)建合并分支
? ? 分支就是指針,始終指向提交(commit),可以創(chuàng)建多個(gè)分支(指針),每次操作其中一個(gè)分支,比如dev,
注意HEAD始終指向正在被操作的分支,當(dāng)dev不斷commit時(shí),dev不斷前進(jìn),其他分支還留在原地。
創(chuàng)建:
git checkout -b dev? ? //-b參數(shù) 會(huì)創(chuàng)建并切換到新分支
或者
git branch dev? ? //創(chuàng)建dev分支
git checkout dev? ? //切換到dev
查看的當(dāng)前分支:
git branch
假設(shè)dev分支add并commit了 file.txt? ,dev時(shí)間線就領(lǐng)先于master ,為了讓master趕上進(jìn)度,需要合并
git checkout master? //先切換到master
git merge dev? //將dev分支的工作成果合并到當(dāng)前分支上
刪除分支
git branch -d dev
Git鼓勵(lì)你使用分支完成某個(gè)任務(wù),合并后再刪掉分支,這和直接在master分支上工作效果是一樣的,但過(guò)程更安全。
(2)解決沖突
(3)保留分支歷史的合并,即不使用默認(rèn)的fast forward合并
git merge --no-ff -m "no fast forward merge" dev?
Git會(huì)在merge時(shí)生成一個(gè)新的commit(所以要-m說(shuō)明一下),這樣從分支歷史上就可以看出分支信息。
新生成的commit可以理解為一個(gè)結(jié)點(diǎn),當(dāng)前分支(比如master)指向它,而被合并的分支(比如dev)不會(huì)被刪除。
fast forward合并則是讓當(dāng)前分支指向被合并的分支所在commit(結(jié)點(diǎn)),然后被合并的分支就相當(dāng)于從來(lái)沒(méi)存在過(guò)。
(4)bug的修補(bǔ)策略
git stash? ?
會(huì)保存當(dāng)前分支工作環(huán)境(入棧),如果stash之前有未commit的文件,stash之后將不會(huì)提示你,因?yàn)樵h(huán)境相當(dāng)于被封存了。
注:stash只能保存那些已經(jīng)被追蹤(add)過(guò)的文件,所以stash之前一定要 git add
git stash list? 查看有多少被stash的分支。
進(jìn)行恢復(fù)
git stash apply? //恢復(fù)棧頂?shù)沫h(huán)境
git stash drop? //刪除棧頂
或者
git stash pop? //恢復(fù)并刪除棧頂
設(shè)A為游戲軟件
1、master 上面發(fā)布的是A的1.0版本
2、dev 上開(kāi)發(fā)的是A的2.0版本
3、這時(shí),用戶(hù)反映 1.0版本存在漏洞,有人利用這個(gè)漏洞開(kāi)外掛
4、需要從dev切換到master去填這個(gè)漏洞,正常必須先提交dev目前的工作,才能切換。
5、而dev的工作還未完成,不想提交,所以先把dev的工作stash一下。然后切換到master
6、在master建立分支bugfix并切換.
7、在bugfix上修復(fù)漏洞。
8、修復(fù)后,在master上合并bugfix
9、切回dev,恢復(fù)原本工作,繼續(xù)工作。
(5)多人協(xié)作模式
git checkout -b branch_name origin/branch_name
創(chuàng)建一個(gè)本地分支branch_name ,它與遠(yuǎn)程分支branch_name進(jìn)度相同
git pull 相當(dāng)于git fetch +git merge
首先,可以試圖用git push origin <branch-name>推送自己的修改;
? ? 如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新,需要先用git pull試圖合并;
? ? 如果合并有沖突,則解決沖突,并在本地提交;
? ? 沒(méi)有沖突或者解決掉沖突后,再用git push origin <branch-name>推送就能成功!
? ? 如果git pull提示no tracking information,則說(shuō)明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒(méi)有創(chuàng)建,用命令git branch --? ? set-upstream-to <branch-name> origin/<branch-name>。
查看遠(yuǎn)程庫(kù)信息,使用git remote -v;
本地新建的分支如果不推送到遠(yuǎn)程,對(duì)其他人就是不可見(jiàn)的;
從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠(yuǎn)程的新提交;
在本地創(chuàng)建和遠(yuǎn)程分支對(duì)應(yīng)的分支,使用git checkout -b branch-name origin/branch-name,本地和遠(yuǎn)程分支的名稱(chēng)最好一致;
建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián),使用git branch --set-upstream branch-name origin/branch-name;
從遠(yuǎn)程抓取分支,使用git pull,如果有沖突,要先處理沖突。
(6)rebase
11.標(biāo)簽管理
tag指向某個(gè)commit 類(lèi)似于分支 但不能移動(dòng)。tag和commit id的關(guān)系類(lèi)似于dns和ip的關(guān)系。方便記憶
(1)創(chuàng)建標(biāo)簽
git tag? <tagname>
如git tag v1.0
默認(rèn)對(duì)當(dāng)前commit創(chuàng)建tag?
也可以指定commit創(chuàng)建tag
git tag? <tagname>? <commit id>
如git tag v0.9 fe305b
git tag? 查看所有標(biāo)簽 按字母順序排序
git tag -a <tag name>? -m "說(shuō)明"? <commit id>
-a 指定標(biāo)簽名? -m添加說(shuō)明
git show <tag name>? 顯示某個(gè)標(biāo)簽的信息
(2)刪除 推送標(biāo)簽
命令git push origin <tagname>可以推送一個(gè)本地標(biāo)簽;
命令git push origin --tags可以推送全部未推送過(guò)的本地標(biāo)簽;
命令git tag -d <tagname>可以刪除一個(gè)本地標(biāo)簽;
命令git push origin :refs/tags/<tagname>可以刪除一個(gè)遠(yuǎn)程標(biāo)簽。即推送一個(gè)本地的空標(biāo)簽