色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

45個Git經(jīng)典操作場景,助你一臂之力

dyquk4xk2p3d ? 來源:CSDN ? 2023-09-23 11:11 ? 次閱讀

	

	

	

git對于大家應(yīng)該都不太陌生,熟練使用git已經(jīng)成為程序員的一項基本技能,盡管在工作中有諸如Sourcetree這樣牛X的客戶端工具,使得合并代碼變的很方便。但找工作面試和一些需彰顯個人實(shí)力的場景,仍然需要我們掌握足夠多的git命令。

下邊我們整理了45個日常用git合代碼的經(jīng)典操作場景,基本覆蓋了工作中的需求。

我剛才提交了什么?

如果你用git commit -a提交了一次變化(changes),而你又不確定到底這次提交了哪些內(nèi)容。你就可以用下面的命令顯示當(dāng)前HEAD上的最近一次的提交(commit):

(main)$gitshow

或者

$gitlog-n1-p

我的提交信息(commit message)寫錯了

如果你的提交信息(commit message)寫錯了且這次提交(commit)還沒有推(push), 你可以通過下面的方法來修改提交信息(commit message):

$gitcommit--amend--only

這會打開你的默認(rèn)編輯器, 在這里你可以編輯信息. 另一方面, 你也可以用一條命令一次完成:

$gitcommit--amend--only-m'xxxxxxx'
如果你已經(jīng)推(push)了這次提交(commit), 你可以修改這次提交(commit)然后強(qiáng)推(force push), 但是不推薦這么做。

我提交(commit)里的用戶名和郵箱不對

如果這只是單個提交(commit),修改它:

$gitcommit--amend--author"NewAuthorname"

如果你需要修改所有歷史, 參考 'git filter-branch'的指南頁.

我想從一個提交(commit)里移除一個文件

通過下面的方法,從一個提交(commit)里移除一個文件:

$gitcheckoutHEAD^myfile
$gitadd-A
$gitcommit--amend
這將非常有用,當(dāng)你有一個開放的補(bǔ)丁(open patch),你往上面提交了一個不必要的文件,你需要強(qiáng)推(force push)去更新這個遠(yuǎn)程補(bǔ)丁。

我想刪除我的的最后一次提交(commit)

如果你需要刪除推了的提交(pushed commits),你可以使用下面的方法。可是,這會不可逆的改變你的歷史,也會搞亂那些已經(jīng)從該倉庫拉取(pulled)了的人的歷史。簡而言之,如果你不是很確定,千萬不要這么做。
$gitresetHEAD^--hard
$gitpush-f[remote][branch]

如果你還沒有推到遠(yuǎn)程, 把Git重置(reset)到你最后一次提交前的狀態(tài)就可以了(同時保存暫存的變化):

(my-branch*)$gitreset--softHEAD@{1}

這只能在沒有推送之前有用. 如果你已經(jīng)推了, 唯一安全能做的是git revert SHAofBadCommit, 那會創(chuàng)建一個新的提交(commit)用于撤消前一個提交的所有變化(changes);或者, 如果你推的這個分支是rebase-safe的 (例如:其它開發(fā)者不會從這個分支拉), 只需要使用git push -f

刪除任意提交(commit)

同樣的警告:不到萬不得已的時候不要這么做.

$gitrebase--ontoSHA1_OF_BAD_COMMIT^SHA1_OF_BAD_COMMIT
$gitpush-f[remote][branch]

或者做一個 交互式rebase 刪除那些你想要刪除的提交(commit)里所對應(yīng)的行。

我嘗試推一個修正后的提交(amended commit)到遠(yuǎn)程,但是報錯:

Tohttps://github.com/yourusername/repo.git
![rejected]mybranch->mybranch(non-fast-forward)
error:failedtopushsomerefsto'https://github.com/tanay1337/webmaker.org.git'
hint:Updateswererejectedbecausethetipofyourcurrentbranchisbehind
hint:itsremotecounterpart.Integratetheremotechanges(e.g.
hint:'gitpull...')beforepushingagain.
hint:Seethe'Noteaboutfast-forwards'in'gitpush--help'fordetails.

注意, rebasing(見下面)和修正(amending)會用一個新的提交(commit)代替舊的, 所以如果之前你已經(jīng)往遠(yuǎn)程倉庫上推過一次修正前的提交(commit),那你現(xiàn)在就必須強(qiáng)推(force push) (-f)。注意 –總是確保你指明一個分支!

(my-branch)$gitpushoriginmybranch-f

一般來說,要避免強(qiáng)推. 最好是創(chuàng)建和推(push)一個新的提交(commit),而不是強(qiáng)推一個修正后的提交。后者會使那些與該分支或該分支的子分支工作的開發(fā)者,在源歷史中產(chǎn)生沖突。

我意外的做了一次硬重置(hard reset),我想找回我的內(nèi)容

如果你意外的做了git reset --hard, 你通常能找回你的提交(commit), 因?yàn)镚it對每件事都會有日志,且都會保存幾天。

(main)$gitreflog

你將會看到一個你過去提交(commit)的列表, 和一個重置的提交。選擇你想要回到的提交(commit)的SHA,再重置一次:

(main)$gitreset--hardSHA1234

這樣就完成了。

暫存(Staging)

我需要把暫存的內(nèi)容添加到上一次的提交(commit)

(my-branch*)$gitcommit--amend

我想要暫存一個新文件的一部分,而不是這個文件的全部

一般來說, 如果你想暫存一個文件的一部分, 你可這樣做:

$gitadd--patchfilename.x

-p簡寫。這會打開交互模式, 你將能夠用s選項來分隔提交(commit);然而, 如果這個文件是新的, 會沒有這個選擇, 添加一個新文件時, 這樣做:

$gitadd-Nfilename.x

然后, 你需要用e選項來手動選擇需要添加的行,執(zhí)行git diff --cached將會顯示哪些行暫存了哪些行只是保存在本地了。

我想把在一個文件里的變化(changes)加到兩個提交(commit)里

git add會把整個文件加入到一個提交.git add -p允許交互式的選擇你想要提交的部分.

我想把暫存的內(nèi)容變成未暫存,把未暫存的內(nèi)容暫存起來

多數(shù)情況下,你應(yīng)該將所有的內(nèi)容變?yōu)槲磿捍妫缓笤龠x擇你想要的內(nèi)容進(jìn)行commit。但假定你就是想要這么做,這里你可以創(chuàng)建一個臨時的commit來保存你已暫存的內(nèi)容,然后暫存你的未暫存的內(nèi)容并進(jìn)行stash。然后reset最后一個commit將原本暫存的內(nèi)容變?yōu)槲磿捍妫詈髎tash pop回來。

$gitcommit-m"WIP"
$gitadd.
$gitstash
$gitresetHEAD^
$gitstashpop--index0

注意1: 這里使用pop僅僅是因?yàn)橄氡M可能保持冪等。注意2: 假如你不加上--index你會把暫存的文件標(biāo)記為為存儲。

未暫存(Unstaged)的內(nèi)容

我想把未暫存的內(nèi)容移動到一個新分支

$gitcheckout-bmy-branch

我想把未暫存的內(nèi)容移動到另一個已存在的分支

$gitstash
$gitcheckoutmy-branch
$gitstashpop

我想丟棄本地未提交的變化(uncommitted changes)

如果你只是想重置源(origin)和你本地(local)之間的一些提交(commit),你可以:

#onecommit
(my-branch)$gitreset--hardHEAD^
#twocommits
(my-branch)$gitreset--hardHEAD^^
#fourcommits
(my-branch)$gitreset--hardHEAD~4
#or
(main)$gitcheckout-f

重置某個特殊的文件, 你可以用文件名做為參數(shù):

$gitresetfilename

我想丟棄某些未暫存的內(nèi)容

如果你想丟棄工作拷貝中的一部分內(nèi)容,而不是全部。

簽出(checkout)不需要的內(nèi)容,保留需要的。
$gitcheckout-p
#Answerytoallofthesnippetsyouwanttodrop

另外一個方法是使用stash, Stash所有要保留下的內(nèi)容, 重置工作拷貝, 重新應(yīng)用保留的部分。

$gitstash-p
#Selectallofthesnippetsyouwanttosave
$gitreset--hard
$gitstashpop

或者, stash 你不需要的部分, 然后stash drop。

$gitstash-p
#Selectallofthesnippetsyoudon'twanttosave
$gitstashdrop

分支(Branches)

我從錯誤的分支拉取了內(nèi)容,或把內(nèi)容拉取到了錯誤的分支

這是另外一種使用git reflog情況,找到在這次錯誤拉(pull) 之前HEAD的指向。

(main)$gitreflog
ab7555fHEAD@{0}:pulloriginwrong-branch:Fast-forward
c5bc55aHEAD@{1}:checkout:checkoutmessagegoeshere

重置分支到你所需的提交(desired commit):

$gitreset--hardc5bc55a

完成。

我想扔掉本地的提交(commit),以便我的分支與遠(yuǎn)程的保持一致

先確認(rèn)你沒有推(push)你的內(nèi)容到遠(yuǎn)程。git status會顯示你領(lǐng)先(ahead)源(origin)多少個提交:
(my-branch)$gitstatus
#Onbranchmy-branch
#Yourbranchisaheadof'origin/my-branch'by2commits.
#(use"gitpush"topublishyourlocalcommits)
#

一種方法是:

(main)$gitreset--hardorigin/my-branch

我需要提交到一個新分支,但錯誤的提交到了main

在main下創(chuàng)建一個新分支,不切換到新分支,仍在main下:

(main)$gitbranchmy-branch

把main分支重置到前一個提交:

(main)$gitreset--hardHEAD^

HEAD^HEAD^1的簡寫,你可以通過指定要設(shè)置的HEAD來進(jìn)一步重置。

或者, 如果你不想使用HEAD^, 找到你想重置到的提交(commit)的hash(git log能夠完成), 然后重置到這個hash。使用git push同步內(nèi)容到遠(yuǎn)程。

例如, main分支想重置到的提交的hash為a13b85e:

(main)$gitreset--harda13b85e
HEADisnowata13b85e

簽出(checkout)剛才新建的分支繼續(xù)工作:

(main)$gitcheckoutmy-branch

我想保留來自另外一個ref-ish的整個文件

假設(shè)你正在做一個原型方案(原文為working spike (see note)), 有成百的內(nèi)容,每個都工作得很好。現(xiàn)在, 你提交到了一個分支,保存工作內(nèi)容:
(solution)$gitadd-A&&gitcommit-m"Addingallchangesfromthisspikeintoonebigcommit."

當(dāng)你想要把它放到一個分支里 (可能是feature, 或者develop), 你關(guān)心是保持整個文件的完整,你想要一個大的提交分隔成比較小。

假設(shè)你有:

  • 分支solution, 擁有原型方案, 領(lǐng)先develop分支。
  • 分支develop, 在這里你應(yīng)用原型方案的一些內(nèi)容。

我去可以通過把內(nèi)容拿到你的分支里,來解決這個問題:

(develop)$gitcheckoutsolution--file1.txt

這會把這個文件內(nèi)容從分支solution拿到分支develop里來:

#Onbranchdevelop
#Yourbranchisup-to-datewith'origin/develop'.
#Changestobecommitted:
#(use"gitresetHEAD..."tounstage)
#
#modified:file1.txt

然后, 正常提交。

Note: Spike solutions are made to analyze or solve the problem. These solutions are used for estimation and discarded once everyone gets clear visualization of the problem.

我把幾個提交(commit)提交到了同一個分支,而這些提交應(yīng)該分布在不同的分支里

假設(shè)你有一個main分支, 執(zhí)行git log, 你看到你做過兩次提交:

(main)$gitlog

commite3851e817c451cc36f2e6f3049db528415e3c114
Author:AlexLee
Date:TueJul2215272014-0400

Bug#21-AddedCSRFprotection

commit5ea51731d150f7ddc4a365437931cd8be3bf3131
Author:AlexLee
Date:TueJul2215122014-0400

Bug#14-Fixedspacingontitle

commita13b85e984171c6e2a1729bb061994525f626d14
Author:AkiRose
Date:TueJul2101482014-0400

Firstcommit

讓我們用提交hash(commit hash)標(biāo)記bug (e3851e8for #21,5ea5173for #14).

首先, 我們把main分支重置到正確的提交(a13b85e):

(main)$gitreset--harda13b85e
HEADisnowata13b85e

現(xiàn)在, 我們對 bug #21 創(chuàng)建一個新的分支:

(main)$gitcheckout-b21
(21)$

接著, 我們用cherry-pick把對bug #21的提交放入當(dāng)前分支。這意味著我們將應(yīng)用(apply)這個提交(commit),僅僅這一個提交(commit),直接在HEAD上面。

(21)$gitcherry-picke3851e8

這時候, 這里可能會產(chǎn)生沖突, 參見交互式 rebasing 章沖突節(jié)解決沖突.

再者, 我們?yōu)閎ug #14 創(chuàng)建一個新的分支, 也基于main分支

(21)$gitcheckoutmain
(main)$gitcheckout-b14
(14)$

最后, 為 bug #14 執(zhí)行cherry-pick:

(14)$gitcherry-pick5ea5173

我想刪除上游(upstream)分支被刪除了的本地分支

一旦你在github 上面合并(merge)了一個pull request, 你就可以刪除你fork里被合并的分支。如果你不準(zhǔn)備繼續(xù)在這個分支里工作, 刪除這個分支的本地拷貝會更干凈,使你不會陷入工作分支和一堆陳舊分支的混亂之中。

$gitfetch-p

我不小心刪除了我的分支

如果你定期推送到遠(yuǎn)程, 多數(shù)情況下應(yīng)該是安全的,但有些時候還是可能刪除了還沒有推到遠(yuǎn)程的分支。讓我們先創(chuàng)建一個分支和一個新的文件:

(main)$gitcheckout-bmy-branch
(my-branch)$gitbranch
(my-branch)$touchfoo.txt
(my-branch)$ls
README.mdfoo.txt

添加文件并做一次提交

(my-branch)$gitadd.
(my-branch)$gitcommit-m'foo.txtadded'
(my-branch)$foo.txtadded
1fileschanged,1insertions(+)
createmode100644foo.txt
(my-branch)$gitlog

commit4e3cd85a670ced7cc17a2b5d8d3d809ac88d5012
Author:siemiatj
Date:WedJul3000102014+0200

foo.txtadded

commit69204cdf0acbab201619d95ad8295928e7f411d5
Author:KateHudson
Date:TueJul2913462014-0400

Fixes#6:Forcepushingafteramendingcommits

現(xiàn)在我們切回到主(main)分支,‘不小心的’刪除my-branch分支

(my-branch)$gitcheckoutmain
Switchedtobranch'main'
Yourbranchisup-to-datewith'origin/main'.
(main)$gitbranch-Dmy-branch
Deletedbranchmy-branch(was4e3cd85).
(main)$echoohnoes,deletedmybranch!
ohnoes,deletedmybranch!

在這時候你應(yīng)該想起了reflog, 一個升級版的日志,它存儲了倉庫(repo)里面所有動作的歷史。

(main)$gitreflog
69204cdHEAD@{0}:checkout:movingfrommy-branchtomain
4e3cd85HEAD@{1}:commit:foo.txtadded
69204cdHEAD@{2}:checkout:movingfrommaintomy-branch

正如你所見,我們有一個來自刪除分支的提交hash(commit hash),接下來看看是否能恢復(fù)刪除了的分支。

(main)$gitcheckout-bmy-branch-help
Switchedtoanewbranch'my-branch-help'
(my-branch-help)$gitreset--hard4e3cd85
HEADisnowat4e3cd85foo.txtadded
(my-branch-help)$ls
README.mdfoo.txt

看! 我們把刪除的文件找回來了。Git的reflog在rebasing出錯的時候也是同樣有用的。

我想刪除一個分支

刪除一個遠(yuǎn)程分支:

(main)$gitpushorigin--deletemy-branch

你也可以:

(main)$gitpushorigin:my-branch

刪除一個本地分支:

(main)$gitbranch-Dmy-branch

我想從別人正在工作的遠(yuǎn)程分支簽出(checkout)一個分支

首先, 從遠(yuǎn)程拉取(fetch) 所有分支:

(main)$gitfetch--all

假設(shè)你想要從遠(yuǎn)程的daves分支簽出到本地的daves

(main)$gitcheckout--trackorigin/daves
Branchdavessetuptotrackremotebranchdavesfromorigin.
Switchedtoanewbranch'daves'

(--trackgit checkout -b [branch] [remotename]/[branch]的簡寫)

這樣就得到了一個daves分支的本地拷貝, 任何推過(pushed)的更新,遠(yuǎn)程都能看到.

Rebasing 和合并(Merging)

我想撤銷rebase/merge

你可以合并(merge)或rebase了一個錯誤的分支, 或者完成不了一個進(jìn)行中的rebase/merge。Git 在進(jìn)行危險操作的時候會把原始的HEAD保存在一個叫ORIG_HEAD的變量里, 所以要把分支恢復(fù)到rebase/merge前的狀態(tài)是很容易的。

(my-branch)$gitreset--hardORIG_HEAD

我已經(jīng)rebase過, 但是我不想強(qiáng)推(force push)

不幸的是,如果你想把這些變化(changes)反應(yīng)到遠(yuǎn)程分支上,你就必須得強(qiáng)推(force push)。是因你快進(jìn)(Fast forward)了提交,改變了Git歷史, 遠(yuǎn)程分支不會接受變化(changes),除非強(qiáng)推(force push)。這就是許多人使用 merge 工作流, 而不是 rebasing 工作流的主要原因之一, 開發(fā)者的強(qiáng)推(force push)會使大的團(tuán)隊陷入麻煩。

使用時需要注意,一種安全使用 rebase 的方法是,不要把你的變化(changes)反映到遠(yuǎn)程分支上, 而是按下面的做:
(main)$gitcheckoutmy-branch
(my-branch)$gitrebase-imain
(my-branch)$gitcheckoutmain
(main)$gitmerge--ff-onlymy-branch

我需要組合(combine)幾個提交(commit)

假設(shè)你的工作分支將會做對于main的pull-request。一般情況下你不關(guān)心提交(commit)的時間戳,只想組合所有提交(commit) 到一個單獨(dú)的里面, 然后重置(reset)重提交(recommit)。確保主(main)分支是最新的和你的變化都已經(jīng)提交了, 然后:
(my-branch)$gitreset--softmain
(my-branch)$gitcommit-am"Newawesomefeature"

如果你想要更多的控制, 想要保留時間戳, 你需要做交互式rebase (interactive rebase):

(my-branch)$gitrebase-imain

如果沒有相對的其它分支, 你將不得不相對自己的HEAD進(jìn)行 rebase。例如:你想組合最近的兩次提交(commit), 你將相對于HEAD~2進(jìn)行rebase, 組合最近3次提交(commit), 相對于HEAD~3, 等等。

(main)$gitrebase-iHEAD~2

在你執(zhí)行了交互式 rebase的命令(interactive rebase command)后, 你將在你的編輯器里看到類似下面的內(nèi)容:

pick a9c8a1d Some refactoring
pick 01b2fd8 New awesome feature
pick b729ad5 fixup
pick e3851e8 another fix

# Rebase 8074d12..b729ad5 onto 8074d12
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

所有以#開頭的行都是注釋, 不會影響 rebase.

然后,你可以用任何上面命令列表的命令替換pick, 你也可以通過刪除對應(yīng)的行來刪除一個提交(commit)。

例如, 如果你想單獨(dú)保留最舊(first)的提交(commit),組合所有剩下的到第二個里面, 你就應(yīng)該編輯第二個提交(commit)后面的每個提交(commit) 前的單詞為f:

pick a9c8a1d Some refactoring
pick 01b2fd8 New awesome feature
f b729ad5 fixup
f e3851e8 another fix

如果你想組合這些提交(commit)并重命名這個提交(commit), 你應(yīng)該在第二個提交(commit)旁邊添加一個r,或者更簡單的用s替代f:

pick a9c8a1d Some refactoring
pick 01b2fd8 New awesome feature
s b729ad5 fixup
s e3851e8 another fix

你可以在接下來彈出的文本提示框里重命名提交(commit)。

Newer, awesomer features

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# rebase in progress; onto 8074d12
# You are currently editing a commit while rebasing branch 'main' on '8074d12'.
#
# Changes to be committed:
#modified:   README.md
#

如果成功了, 你應(yīng)該看到類似下面的內(nèi)容:

(main)$Successfullyrebasedandupdatedrefs/heads/main.

安全合并(merging)策略

--no-commit執(zhí)行合并(merge)但不自動提交, 給用戶在做提交前檢查和修改的機(jī)會。no-ff會為特性分支(feature branch)的存在過留下證據(jù), 保持項目歷史一致。
(main)$gitmerge--no-ff--no-commitmy-branch

我需要將一個分支合并成一個提交(commit)

(main)$gitmerge--squashmy-branch

我只想組合(combine)未推的提交(unpushed commit)

有時候,在將數(shù)據(jù)推向上游之前,你有幾個正在進(jìn)行的工作提交(commit)。這時候不希望把已經(jīng)推(push)過的組合進(jìn)來,因?yàn)槠渌丝赡芤呀?jīng)有提交(commit)引用它們了。
(main)$gitrebase-i@{u}

這會產(chǎn)生一次交互式的rebase(interactive rebase), 只會列出沒有推(push)的提交(commit), 在這個列表時進(jìn)行reorder/fix/squash 都是安全的。

檢查是否分支上的所有提交(commit)都合并(merge)過了

檢查一個分支上的所有提交(commit)是否都已經(jīng)合并(merge)到了其它分支, 你應(yīng)該在這些分支的head(或任何 commits)之間做一次diff:

(main)$gitlog--graph--left-right--cherry-pick--onelineHEAD...feature/120-on-scroll

這會告訴你在一個分支里有而另一個分支沒有的所有提交(commit), 和分支之間不共享的提交(commit)的列表。另一個做法可以是:

(main)$gitlogmain^feature/120-on-scroll--no-merges

交互式rebase(interactive rebase)可能出現(xiàn)的問題

這個rebase 編輯屏幕出現(xiàn)'noop'

如果你看到的是這樣:
noop

這意味著你rebase的分支和當(dāng)前分支在同一個提交(commit)上, 或者領(lǐng)先(ahead)當(dāng)前分支。你可以嘗試:

  • 檢查確保主(main)分支沒有問題
  • rebase HEAD~2或者更早

有沖突的情況

如果你不能成功的完成rebase, 你可能必須要解決沖突。

首先執(zhí)行git status找出哪些文件有沖突:
(my-branch)$gitstatus
Onbranchmy-branch
Changesnotstagedforcommit:
(use"gitadd..."toupdatewhatwillbecommitted)
(use"gitcheckout--..."todiscardchangesinworkingdirectory)

modified:README.md

在這個例子里面,README.md有沖突。打開這個文件找到類似下面的內(nèi)容:

   <<<<<<< HEAD
   some code
   =========
   some code
   >>>>>>> new-commit
你需要解決新提交的代碼(示例里, 從中間==線到new-commit的地方)與HEAD之間不一樣的地方.有時候這些合并非常復(fù)雜,你應(yīng)該使用可視化的差異編輯器(visual diff editor):
(main*)$gitmergetool-topendiff

在你解決完所有沖突和測試過后,git add變化了的(changed)文件, 然后用git rebase --continue繼續(xù)rebase。

(my-branch)$gitaddREADME.md
(my-branch)$gitrebase--continue

如果在解決完所有的沖突過后,得到了與提交前一樣的結(jié)果, 可以執(zhí)行git rebase --skip

任何時候你想結(jié)束整個rebase 過程,回來rebase前的分支狀態(tài), 你可以做:

(my-branch)$gitrebase--abort

Stash

暫存所有改動

暫存你工作目錄下的所有改動

$gitstash

你可以使用-u來排除一些文件

$gitstash-u

暫存指定文件

假設(shè)你只想暫存某一個文件
$gitstashpushworking-directory-path/filename.ext

假設(shè)你想暫存多個文件

$gitstashpushworking-directory-path/filename1.extworking-directory-path/filename2.ext

暫存時記錄消息

這樣你可以在list時看到它

$gitstashsave

$gitstashpush-m

使用某個指定暫存

首先你可以查看你的stash記錄

$gitstashlist

然后你可以apply某個stash

$gitstashapply"stash@{n}"

此處, 'n'是stash在棧中的位置,最上層的stash會是0

除此之外,也可以使用時間標(biāo)記(假如你能記得的話)。

$gitstashapply"stash@{2.hours.ago}"

暫存時保留未暫存的內(nèi)容

你需要手動create一個stash commit, 然后使用git stash store

$gitstashcreate
$gitstashstore-m"commit-message"CREATED_SHA1

雜項(Miscellaneous Objects)

克隆所有子模塊

$gitclone--recursivegit://github.com/foo/bar.git

如果已經(jīng)克隆了:

$gitsubmoduleupdate--init--recursive

刪除標(biāo)簽(tag)

$gittag-d
$gitpush:refs/tags/

恢復(fù)已刪除標(biāo)簽(tag)

如果你想恢復(fù)一個已刪除標(biāo)簽(tag), 可以按照下面的步驟: 首先, 需要找到無法訪問的標(biāo)簽(unreachable tag):

$gitfsck--unreachable|greptag

記下這個標(biāo)簽(tag)的hash,然后用Git的 update-ref

$gitupdate-refrefs/tags/<hash>

這時你的標(biāo)簽(tag)應(yīng)該已經(jīng)恢復(fù)了。

已刪除補(bǔ)丁(patch)

如果某人在 GitHub 上給你發(fā)了一個pull request, 但是然后他刪除了他自己的原始 fork, 你將沒法克隆他們的提交(commit)或使用git am。在這種情況下, 最好手動的查看他們的提交(commit),并把它們拷貝到一個本地新分支,然后做提交。

做完提交后, 再修改作者,參見變更作者。然后, 應(yīng)用變化, 再發(fā)起一個新的pull request。

跟蹤文件(Tracking Files)

我只想改變一個文件名字的大小寫,而不修改內(nèi)容

(main)$gitmv--forcemyfileMyFile

我想從Git刪除一個文件,但保留該文件

(main)$gitrm--cachedlog.txt

配置(Configuration)

我想給一些Git命令添加別名(alias)

在 OS X 和 Linux 下, 你的 Git的配置文件儲存在~/.gitconfig。我在[alias]部分添加了一些快捷別名(和一些我容易拼寫錯誤的),如下:

[alias]
    a = add
    amend = commit --amend
    c = commit
    ca = commit --amend
    ci = commit -a
    co = checkout
    d = diff
    dc = diff --changed
    ds = diff --staged
    f = fetch
    loll = log --graph --decorate --pretty=oneline --abbrev-commit
    m = merge
    one = log --pretty=oneline
    outstanding = rebase -i @{u}
    s = status
    unpushed = log @{u}
    wc = whatchanged
    wip = rebase -i @{u}
    zap = fetch -p

我想緩存一個倉庫(repository)的用戶名和密碼

你可能有一個倉庫需要授權(quán),這時你可以緩存用戶名和密碼,而不用每次推/拉(push/pull)的時候都輸入,Credential helper能幫你。
$gitconfig--globalcredential.helpercache
#Setgittousethecredentialmemorycache
$gitconfig--globalcredential.helper'cache--timeout=3600'
#Setthecachetotimeoutafter1hour(settingisinseconds)

我不知道我做錯了些什么

你把事情搞砸了:你重置(reset)了一些東西, 或者你合并了錯誤的分支, 亦或你強(qiáng)推了后找不到你自己的提交(commit)了。有些時候, 你一直都做得很好, 但你想回到以前的某個狀態(tài)。

這就是git reflog的目的,reflog記錄對分支頂端(the tip of a branch)的任何改變, 即使那個頂端沒有被任何分支或標(biāo)簽引用。基本上, 每次HEAD的改變, 一條新的記錄就會增加到reflog。遺憾的是,這只對本地分支起作用,且它只跟蹤動作 (例如,不會跟蹤一個沒有被記錄的文件的任何改變)。

(main)$gitreflog
0a2e358HEAD@{0}:reset:movingtoHEAD~2
0254ea7HEAD@{1}:checkout:movingfrom2.2tomain
c10f740HEAD@{2}:checkout:movingfrommainto2.2

上面的reflog展示了從main分支簽出(checkout)到2.2 分支,然后再簽回。那里,還有一個硬重置(hard reset)到一個較舊的提交。最新的動作出現(xiàn)在最上面以HEAD@{0}標(biāo)識.

如果事實(shí)證明你不小心回移(move back)了提交(commit), reflog 會包含你不小心回移前main上指向的提交(0254ea7)。

$gitreset--hard0254ea7

然后使用git reset就可以把main改回到之前的commit,這提供了一個在歷史被意外更改情況下的安全網(wǎng)。


	


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4803

    瀏覽量

    68754
  • Git
    Git
    +關(guān)注

    關(guān)注

    0

    文章

    201

    瀏覽量

    15786

原文標(biāo)題:45 個 Git 經(jīng)典操作場景,助你一臂之力

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    常用電源設(shè)計技巧(含電路圖)

    本帖最后由 eehome 于 2013-1-5 10:02 編輯 本文羅列了八電源工程師常用的電源設(shè)計技巧。助您的設(shè)計一臂之力
    發(fā)表于 07-16 16:31

    求助大神幫小子用LABVIEW做一個庫房管理軟件,主要用于電子零件的管理儲存.。

    畢業(yè)設(shè)計要求做這個,從網(wǎng)上買了庫房管理軟件做參考,功能基本齊全,也能理解。問題就是發(fā)現(xiàn)憑借自己對LAB的熟悉,目前簡單的功能實(shí)現(xiàn)都很艱難。眼看畢業(yè)答辯在即,心急如焚,如有壯漢站出助小子一臂之力,必有重謝!!!好人
    發(fā)表于 05-09 16:38

    玩轉(zhuǎn)小四軸

    相信很多人喜歡玩小機(jī),在網(wǎng)上看到這款H型小四軸,分享給大家,希望祝大家一臂之力
    發(fā)表于 12-19 22:55

    求助帖子 基于單片機(jī)的數(shù)字電壓表 基本全部完成 求大神指教些問題 ADC0808 LCD1602

    一臂之力瑪法大神么都過來看看求助小弟一臂之力瑪法大神么都過來看看求助小弟一臂之力瑪法大神么都過來看看求助小弟一臂之力瑪法大神么都過來看看求助小弟一臂
    發(fā)表于 04-18 23:07

    電源工程師常用八大電源設(shè)計技巧

    本資料羅列了八電源工程師常用的電源設(shè)計技巧。助你的設(shè)計一臂之力、反激式電源中的鐵氧體磁放大器 :對于兩輸出端都提供實(shí)際功率(5 V
    發(fā)表于 10-16 09:54

    傳感器助重慶汽車碰撞實(shí)驗(yàn)一臂之力

    傳感器助重慶汽車碰撞實(shí)驗(yàn)一臂之力   據(jù)相關(guān)人員介紹,車輛碰撞實(shí)驗(yàn)室兩百米長的跑道是西部地區(qū)最長的,在牽引車的牽引下,車輛最高時
    發(fā)表于 03-16 16:36 ?653次閱讀

    助續(xù)航一臂之力:解析電池管理BMS與SOC精度

    現(xiàn)階段容量較小電池的純電動汽車,有很多用戶反映使用體驗(yàn)很糟糕,那么我們就來討論兩與之相關(guān)的議題:電池能量管理(BMS)和荷電狀態(tài)(SOC)的精度,看看這兩東西怎樣才能助續(xù)航一臂之力
    發(fā)表于 11-04 20:28 ?1607次閱讀
    助續(xù)航<b class='flag-5'>一臂之力</b>:解析電池管理BMS與SOC精度

    短視頻熱歌勁曲聽不夠?華為nova 2系列天籟音質(zhì)助你一臂之力

    短視頻熱歌勁曲聽不夠?華為nova 2系列天籟音質(zhì)助你一臂之力 無論想借著3D立體音效的短視頻嗨把,還是想聽到大片質(zhì)感的LIVE版音樂,華為nova 2系列的發(fā)燒級音質(zhì)都能滿足。
    發(fā)表于 08-15 12:40 ?861次閱讀

    驍龍845有哪些大師級攝影功能 驍龍845攝影怎樣

    部搭載Qualcomm驍龍845移動平臺的手機(jī)可以助你一臂之力,離朋友圈攝影大師近了不止步。
    的頭像 發(fā)表于 07-16 10:11 ?3345次閱讀

    印度本土手機(jī)品牌市占率節(jié)節(jié)下滑,聯(lián)發(fā)科及高通愿助一臂之力

    面對印度本土手機(jī)品牌競爭力山河日下,印度經(jīng)濟(jì)時報(The Economic Times)報導(dǎo),聯(lián)發(fā)科及高通都表示愿意提供一臂之力,且正在和印度本土品牌合作。值得注意的是,從聯(lián)發(fā)科及高通的說法來看,他們都希望在智能手機(jī)市場、而非功能手機(jī)市場與印度本土業(yè)者展開合作。
    的頭像 發(fā)表于 08-08 09:42 ?3475次閱讀

    常用的電源設(shè)計技巧圖解 資源下載

    本文羅列了八電源工程師常用的電源設(shè)計技巧。助您的設(shè)計一臂之力
    發(fā)表于 06-09 10:40 ?27次下載

    45日常用git合代碼的經(jīng)典操作場景

    如果你用 git commit -a 提交了次變化(changes),而你又不確定到底這次提交了哪些內(nèi)容。你就可以用下面的命令顯示當(dāng)前HEAD上的最近次的提交(commit):
    的頭像 發(fā)表于 04-13 10:39 ?957次閱讀

    創(chuàng)維A20 Pro搭載MediaTek S900智能顯示芯片

    創(chuàng)維 A20 Pro 用強(qiáng)勁性能和斑斕的色彩體驗(yàn),助你鮮衣怒馬的夢想一臂之力,讓年輕力流光溢彩、熠熠生輝。
    的頭像 發(fā)表于 10-17 16:13 ?1846次閱讀

    45Git經(jīng)典操作場景

    如果你用 git commit -a 提交了次變化(changes),而你又不確定到底這次提交了哪些內(nèi)容。你就可以用下面的命令顯示當(dāng)前HEAD上的最近次的提交(commit):
    的頭像 發(fā)表于 01-06 15:29 ?605次閱讀

    業(yè)務(wù)出海,華為云全球加速服務(wù)GA助一臂之力

    業(yè)務(wù)出海,華為云全球加速服務(wù)GA助一臂之力 隨著經(jīng)濟(jì)全球化的深入發(fā)展,越來越多的企業(yè)開始走出國門走向世界,開始與世界各國的企業(yè)開展貿(mào)易合作,這種全球性的貿(mào)易和本國國內(nèi)的貿(mào)易有所不同的是,由于供求雙方
    的頭像 發(fā)表于 05-08 15:08 ?427次閱讀
    主站蜘蛛池模板: 久久精品视频免费| 国产看午夜精品理论片| 国产色情短视频在线网站| 女教师の诱惑| 在线视频 国产 日韩 欧美| 国产香蕉尹人视频在线| 色欲国产麻豆精品AV免费| a视频在线免费观看| 久久亚洲A片COM人成A| 亚洲精品在线播放视频| 国产精品无码视频一区二区| 日韩性大片| ZZoo兽2皇| 欧美日韩久久久精品A片 | 国产精品女上位好爽在线短片| 欧美性视频xxxxhd| 99成人在线视频| 免费国产成人高清在线看软件| 御姐被吸奶| 久久91精品国产91久| 亚洲人成网站在线播放| 国精产品一区一区三区有限公司| 午夜DV内射一区二区| 国产高清视频免费最新在线| 四虎永久在线精品国产| 高h np 强j 乱l 双性| 日日夜夜天天操| 第一次破女初国产美女| 日本精品久久无码影院| 厕所xxxxx| 日韩精品一区二区三区AV在线观看| 爱穿丝袜的麻麻3d漫画免费 | 无码中文字幕热热久久| 国产成人拍精品视频网 | xxx性欧美在线| 青青青青青青青草| 成人麻豆日韩在无码视频| 日韩欧美中文字幕在线二视频| 大屁股妇女流出白浆| 色欲精品久久人妻AV中文字幕| 国产白丝精品爽爽久久久久久蜜臀|