學(xué)習(xí)Git有一段時(shí)間了,一路上也一直在寫有關(guān)于Git方面的文章,但總覺(jué)得不是我想要的,就是感覺(jué)有點(diǎn)肉肉的,不夠直接,不夠馬上出效果,所以才有了這篇文章,當(dāng)然這文章可能會(huì)不斷更新和修正,希望讀者可以作為一個(gè)工具文章使用,我也會(huì)努力將其優(yōu)化的更加的符合工作場(chǎng)景
說(shuō)明
1、在[...]中的內(nèi)容,需要根據(jù)實(shí)際情況進(jìn)行修改
要解決這個(gè)問(wèn)題,需要使用SSH秘鑰的方式,接下來(lái)我就講一下怎么進(jìn)行配置。
1.在本地生成私鑰和公鑰
git config --global user.name "username"http://用戶昵稱git config --global user.email "emailAddress"http://github或者gitlib的郵箱地址ssh-keygen -t rsa -C "emailAddress"http://github或者gitlib郵箱賬戶地址
2.將電腦上的公鑰與遠(yuǎn)程倉(cāng)庫(kù)進(jìn)行綁定
本地會(huì)在上面的步驟中會(huì)生成一個(gè)id_rsa.pub(默認(rèn)情況是這個(gè)名稱),將該文件中的內(nèi)容copy到遠(yuǎn)程倉(cāng)庫(kù)github或gitlib的settings的SSH配置選項(xiàng)中。
Tittle名稱自由發(fā)揮
將遠(yuǎn)程的數(shù)據(jù)復(fù)制一份到本地
#【倉(cāng)庫(kù)copy地址】git clone [git@rep.xx.com:zoeminghong/hello.git]
現(xiàn)在打算將本地的工程,放到Git倉(cāng)庫(kù)進(jìn)行托管了,并且遠(yuǎn)程Git倉(cāng)庫(kù)已經(jīng)創(chuàng)建了該項(xiàng)目的工程
#本地初始化工程,會(huì)生成一個(gè).git文件git init #將本地的工程與遠(yuǎn)程倉(cāng)庫(kù)中的項(xiàng)目進(jìn)行關(guān)聯(lián)(不用關(guān)心項(xiàng)目名不一致的問(wèn)題)#此時(shí)本地工程與遠(yuǎn)程倉(cāng)庫(kù)已經(jīng)建立了聯(lián)系git remote add origin [git@rep.xx.com:zoeminghong/hello.git] #將本地所有文件添加到Git中,進(jìn)行監(jiān)管git add . #將內(nèi)容提交 【提交注釋】git commit -m "[...]" #將本地的內(nèi)容同步到遠(yuǎn)程倉(cāng)庫(kù)中g(shù)it push -u origin master
git show [十六進(jìn)制碼]
git log --graph --pretty=oneline --abbrev-commit
git ls-files -u
本地代碼未commit的前提下,解決與遠(yuǎn)程代碼沖突問(wèn)題
git pull #失敗#將當(dāng)前修改進(jìn)行暫存起來(lái)git stash#或git stash save "[注釋]" #獲取最新的遠(yuǎn)程倉(cāng)庫(kù)代碼git pull #恢復(fù)暫存的內(nèi)容git stash pop#stash其他操作#恢復(fù)最近一次save的原工作區(qū)內(nèi)容,,并刪除stash記錄git stash pop#恢復(fù)最近一次save的原工作區(qū)內(nèi)容,但不刪除stash記錄git stash apply#刪除stash記錄git stash drop#獲取暫存列表git stash list
但,上面的也可能存在問(wèn)題,由于本地存在未被追蹤的文件,并且遠(yuǎn)程倉(cāng)庫(kù)pull的時(shí)候也存在同名的文件,就會(huì)存在pull失敗,在這種情況下,在
git stash
后面追加--include-untracked
,會(huì)將遠(yuǎn)程的文件與本地的文件融合stash只會(huì)保存當(dāng)前索引和工作目錄的狀態(tài),其保存的是add和commit的中間狀態(tài),如果還沒(méi)有被git追蹤的文件,是不會(huì)被記錄的
git stash savegit pull --rebase
git stash branch [newBranchName]
git stash show -p stash{0}
本地代碼已經(jīng)commit后,解決與遠(yuǎn)程代碼沖突問(wèn)題
# 獲取遠(yuǎn)端庫(kù)最新信息 【分支名稱】git fetch origin [master] # 做比較git diff [本地分支名] origin/[遠(yuǎn)程分支名] # 拉取最新代碼,同時(shí)會(huì)讓你merge沖突git pull
方法2
# 獲取最新代碼到tmp分支上 [遠(yuǎn)程的分支:本地分支]git fetch origin [master:tmp] # 當(dāng)前分支與tmp進(jìn)行比較git diff tmp # 修改沖突部分,進(jìn)行本地commit操作git add . git commit -m "[...]" # 將tmp中內(nèi)容合并到當(dāng)前分支中g(shù)it merge tmp # 刪除分支git branch -d tmp
保留副本操作
git rm --cache [文件名]
直接文件刪除
git rm [文件名]
還原到最近的版本,廢棄本地做的修改(當(dāng)前文件修改沒(méi)有進(jìn)行add操作的時(shí)候)
git checkout -- [文件名]
取消已經(jīng)暫存的文件(撤銷先前"git add"的操作)
#當(dāng)前HEAD,返回到上一次commit點(diǎn),不會(huì)有任何日志記錄git reset HEAD --hard
git reset HEAD [文件名]
回退所有內(nèi)容到上一個(gè)提交點(diǎn)
#最近內(nèi)容已經(jīng)commit的情況下git reset HEAD^ --hard
回退這個(gè)文件的版本到上一個(gè)版本
#最近內(nèi)容已經(jīng)commit的情況下git reset HEAD^ [文件名]
將本地的狀態(tài)回退到和遠(yuǎn)程的一樣
git reset –-hard origin/[分支名]
回退到某個(gè)版本
# 獲取所有的HEAD更改信息的sha1值git refloggit reset [SHA1]
回退到上一次提交的狀態(tài),按照某一次的commit完全反向的進(jìn)行一次commit.(代碼回滾到上個(gè)版本,并提交git)
git revert HEAD
使用reset是不會(huì)有日志記錄的,revert則會(huì)要提交一個(gè)記錄點(diǎn)
修改最新的提交信息(修改提交的注釋信息)
git commit --amend
本地創(chuàng)建了一個(gè)分支,遠(yuǎn)程也有一個(gè)分支,進(jìn)行兩者關(guān)聯(lián)
git checkout -b [本地分支名] origin/[遠(yuǎn)程分支名]
我們?cè)陂_(kāi)發(fā)的時(shí)候,可能存在線上發(fā)布了一個(gè)版本,需要給這個(gè)版本代碼打上一個(gè)標(biāo)簽,到時(shí)候可以方便回退到這個(gè)版本
# 創(chuàng)建tag 【tag名】git tag v1.0 # 查看存在的taggit tag # 將tag更新到遠(yuǎn)程git push origin --tags
接下來(lái)就講解回退到具體的tag
# 保存當(dāng)前編程環(huán)境git stash # 切換回某個(gè)tag(v1.0)git show v1.0 #【sha1】git reset --hard [2da7ef1] # 創(chuàng)建分支來(lái)保存tag的數(shù)據(jù),tag只是一個(gè)節(jié)點(diǎn)的標(biāo)記,無(wú)法承載數(shù)據(jù)的修改記錄,【分支名】git checkout -b [bill] # 接著你就可以在這里改啊改了
切換回主干或其他分支
# 切換分支git checkout master # 日志記錄git reflog # 顯示stash列表git stash list # 恢復(fù)之前的工作環(huán)境代碼git stash apply # 刪除stashgit stash drop
分支與主干合并
git add . git commit -m "v1.1" # bill分支合并到當(dāng)前分支【分支名】git merge [bill]
# 顯示暫存區(qū)和工作區(qū)的差異git diffgit diff [filename] # 顯示暫存區(qū)和上一個(gè)commit的差異【文件名】git diff --cached [hello.txt]git diff --cached [HEAD或者SHA1] [filename] # 顯示工作區(qū)與當(dāng)前分支最新commit之間的差異git diff HEADgit diff [HEAD或分支名] [filename] # 顯示兩次提交之間的差異【分支名】git diff [first-branch]...[second-branch]git diff [SHA1] [SHA1] [filename]#分支之間的差異#分支之間的差異git diff [分支1] [分支2]git diff [分支1]..[分支2]#指定文件git diff [分支1]:[file1] [分支2]:[file2]#查看指定提交范圍內(nèi)的所有變更文件情況git diff --stat master~[范圍值] [分支名]git diff --stat master~5 tmp//還可以值查看具體某一個(gè)文件git diff --stat master~5 tmp test.txt
#先確定范圍git bisect bad #一般都是當(dāng)前HEAD是壞提交【sha1】git bisect good a794f9bd96f06b57b4c10433e4d6abb3f0855749 #上面的步驟就是確定范圍的,接下來(lái)就是回答git的問(wèn)題,他指定的提交點(diǎn)是好的還是壞的git bisect good//如果是壞的,就bad,直到你找到哪個(gè)提交點(diǎn)導(dǎo)致出現(xiàn)問(wèn)題#查看維護(hù)日志git bisect log#完成操作后,要回切到工作分支上git branchgit bisect resetgit branch
git blame -L [起始行數(shù)],[文件名]
#以當(dāng)前節(jié)點(diǎn)作為分支的開(kāi)始起點(diǎn)git branch [分支名]#以SHA1作為分支開(kāi)始起點(diǎn)git branch [分支名] [SHA1]#創(chuàng)建并切換分支,sha1以哪個(gè)節(jié)點(diǎn)作為分支的起點(diǎn)git checkout -b [分支名] [SHA1]
在git中重命名遠(yuǎn)程分支,其實(shí)就是先刪除遠(yuǎn)程分支,然后重命名本地分支,再重新提交一個(gè)遠(yuǎn)程分支。
//顯示現(xiàn)在分支git branch -av//刪除遠(yuǎn)程要?jiǎng)h除的分支develgit push --delete origin devel//重命名本地分支devel為developgit branch -m devel develop//推送到遠(yuǎn)程git push origin develop
這是由于在 github 中,devel 是項(xiàng)目的默認(rèn)分支。要解決此問(wèn)題,這樣操作:
進(jìn)入 github 中該項(xiàng)目的 Settings 頁(yè)面;
設(shè)置 Default Branch 為其他的分支(例如 master);
重新執(zhí)行刪除遠(yuǎn)程分支命令。
git branch -a
git fetch origin [遠(yuǎn)程倉(cāng)庫(kù)分支名] [本地倉(cāng)庫(kù)分支名]
git branch -d [分支名]
git show-branch#或git branch
分支前面都存在*或者!
*表示當(dāng)前分支
在–之后的是記錄分支的提交信息
像
*+ [tmp] 遠(yuǎn)程2
就表示該提交存在于兩個(gè)分支中
git show [分支名]:[文件名]
git show [SHA1] [文件名]
如果存在未被git追蹤的文件,git是會(huì)將其忽略的
如果存在已追蹤且被修改或刪除,必須commit之后,才能切換
如果要不計(jì)后果的情況,強(qiáng)切,加
-f
假如你希望變更作用于另一個(gè)分支上,但由于當(dāng)前分支如果不提交,是無(wú)法切換到另一個(gè)分支上的
git checkout -m [另一個(gè)分支名]
#當(dāng)前分支,得到dev分支中dev~2之前的所有提交內(nèi)容git cherry-pick dev~2
cherry-pick會(huì)生成一條新的提交記錄
系列文章:
git rebse的變基提交
Git如何幫你查原因
從使用場(chǎng)景學(xué)Git
更多內(nèi)容可以關(guān)注微信公眾號(hào),或者訪問(wèn)AppZone網(wǎng)站
聯(lián)系客服