首頁 > Java > java教程 > 主體

git使用雜記

高洛峰
發布: 2017-02-09 09:31:40
原創
1058 人瀏覽過

前言

作為一個開發者,如果現在還不知道git或還不會使用git,那麼你應該好好的反省。自己去好好看看的入門介紹。今天只是對自己在日常中使用git的一些常用命令的介紹與自己認為不錯且能提高我們辦公效率的命令。內容可能會有點雜亂,但絕對都是經典的命令,在此記下筆記,也希望能幫助來賞臉關顧的你們。

區域

在這之前,來介紹一下git的三個區域

  • 工作區(working directory)

  • his

  • 透過一張圖就能簡潔易懂的明白它們之間的轉換。

clone

git使用杂记 先從

clone

指令來介紹,使用過

git

的都知道它。 git colne指令拉取遠端倉庫到本地。但當我們要拉取到指定的資料夾下時,你可能會直接mkdir,其實無需如此,一條指令就能搞定git clone 遠端倉庫 檔案名稱,就是如此簡單。 rm我們在工作中可能會遇到這麼一種情況,使用

git add .

直接將工作區的所有修改的文件加入到暫存區了,但是後面發現有一個文件先不要加進去,此時我們就可以使用以下指令就可以將該檔案退回到工作區。

git rm --cached <file>
登入後複製
登入後複製

stash有這麼一種情況,當你正在開發中時,有一個線上的緊急

bug

需要修復,此時開發中的功能又沒有完成你不想提交,此時你可以使用

git stash

將工作區的文件都存放起來。這時你就可以放心的去切分支修復bug,修復完之後執行git stash pop可以將先前存放的取出,當然也有一些其他的相關命令例如:git stash list查看存放的記錄, git stash drop丟棄存放的記錄。 tag可能在開發中我們要打標籤

git tag tagName

,並且要將對應的標籤推送到遠端倉庫中,此時可以使用以下命令進行推送。

git push --tags tagName
登入後複製
登入後複製

amend當你

commit

以後,發現有一個文件沒有加進上次的

commit

中,或者又修改了一些文件。此時你並不想增加新的commit訊息,只是想將其加入到上次的commit中。這時你就可以使用<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">git commit --amend &lt;file&gt;</pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>將暫存區的文件加入其中,並且你也可以修改此時的commit資訊。

reset

reset

也能實現前面的

rm

的效果,可以使用以下指令來取代前面的git rm --cached <file></file>指令reeereeegit rm --cached <file></file>指令

reee

reee soft參數可以回撤到任意的commit節點進行操作<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">git reset HEAD &lt;file&gt;</pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>執行該指令之後,就回到

index

處,工作區不變、暫存區回到當時的index處。另外還有一個hard參數。 <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">git reset --soft index</pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>

soft

可以說對立,它的效果就在於工作區與暫存區的不同,它會清空這兩個區。 rebase

對於

rebase

是重定向的意思,如果你目前的分支與遠端的分支commit資訊有差異時,會提醒你此時不能進行push,必須先將遠端的commit 資訊拉去到本地來,才能進行提交。對於這種情況就可以使用rebase指令了。以下目前處在develop分支

git使用杂记 此時應該先執行

rebase

指令<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">git reset --hard index</pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>執行完之後,最後再執行

的效果了。如果覺得指令多難記,這裡也可用一條指令來完成上面的效果

git fetch
git rebase origin/master
登入後複製
登入後複製
這是rebase的簡單運用,也是常見的指令了。以下介紹rebase的一個可選參數

--onto

--onto使用場景:開發過程中我們都會創建不同的分支進行開發不同的功能,當你在分支A上創建了新分支B

進行開發功能並且也提交了一些

commit

時,此時你發現原來

A分支上有錯誤的commit,如果要rebasemaster上時,不能將這個錯誤的commit也附帶上。這時候就該--onto大顯神通了。

git使用杂记

当前处在B分支,要得到上面的结果,只需执行如下命令

git rebase --onto master <b的commit hash code> B
登入後複製
登入後複製

这个不仅可以针对不同的分支,也能作用于同一个分支上。所以针对上面的情况可以只对分支B进行操作,等价命令如下:

git rebase --onto <a的commit hash code> <b的commit hash code> B
登入後複製
登入後複製

--interactive

当我们要修改commit信息的名称时,如果要修改的commit处在第一个时,可以使用

git commit --amend
登入後複製

如果不是第一个时,我们就要使用到rebase--interactive可选参数了,可以简写为-i

git rebase -i <commit hash code>
登入後複製

参数后面的commit hash code为需要修改的commit的前一个。执行之后就会出现如下类似的信息:

pick 137cf0a First coommit
pick 163dc38 Second commit

# Rebase f9aee6e..163dc38 onto f9aee6e (2 command(s))
#
# 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
登入後複製
登入後複製

根据提示我们可以有6个可选择的操作。相信提示已经说的很明显了,对于我们这种要修改First coommit的情况,需要使用r

r 137cf0a First commit
pick 163dc38 Second commit
登入後複製
登入後複製

执行之后会跳到修该First coomit的界面,进行修改即可。

First commit

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Thu Jan 26 23:07:10 2017 +0800
#
# rebase in progress; onto f9aee6e
# You are currently editing a commit while rebasing branch 'master' on 'f9aee6e'.
#
# Changes to be committed:
#       new file:   file1
登入後複製
登入後複製

至于其他的操作项,有兴趣的可以自己去尝试一下。例如s操作就可以用来合并commit

branch

相信branch都很熟悉,我这里要说的是他的另一种可能会用到的情况。场景是这样的:如果在你进行创建新的分支时,并不想从当前的commit信息节点进行创建分支。

git使用杂记

要实现如上效果只需在创建分支时在后面再添加额外的参数,该参数就是你所需调到的commit节点的hash code

git branch new_branch <commit hash code>
登入後複製
登入後複製

push

这里提一下push--set-upstream,它的效果是设置上游分支,当我们将远程不存在的本地分支推送到远程时,如果不在推送的分支上,我们一般会使用如下命令进行推送。

git checkout push_branch
git push origin push_branch
登入後複製
登入後複製

下面是简洁的方法,使用该参数无需切换分支,可以直接使用如下命令进行推送。

git push --set-upstream origin push_branch
登入後複製
登入後複製

cherry-pick

这个命令的场景是:当你所在的分支没用,你要删除它,但其中的一个commit你还是想推送到远程master上。

git使用杂记

将分支切换到master,执行以下命令:

git cherry-pick <b的 commit hash code>
登入後複製
登入後複製

merge

我们所熟知的是使用merge来进行分支的合并,每次使用merge时都会自动将副分支合并成一个commit进行推送到主分支上,那么如果我不想它自动推送到主分支上时(可能我还需要进行修改),这时就可以使用--squash操作

git merge --squash dev_branch
登入後複製
登入後複製

执行完以上命令后,我们就可以在暂存区看到一个还未提交的文件状态。

reflog

当我们切分支太频繁了之后,可能会忘了一些分支是从哪个分支切过来的,此时可以使用如下命令查看:

git reflog
登入後複製
登入後複製
894a16d HEAD@{0}: commit: commit another todo
6876e5b HEAD@{1}: checkout: moving from solve_world_hunger to kill_the_batman
324336a HEAD@{2}: commit: commit todo
6876e5b HEAD@{3}: checkout: moving from blowup_sun_for_ransom to solve_world_hunger
6876e5b HEAD@{4}: checkout: moving from kill_the_batman to blowup_sun_for_ransom
6876e5b HEAD@{5}: checkout: moving from cure_common_cold to kill_the_batman
6876e5b HEAD@{6}: commit (initial): initial commit
登入後複製
登入後複製

这样我们就可以看到所用的操作历史了。这样如果我们使用git reset命令不小心删除了需要的东西。可以通过此来查找到删除操作的hash code,之后就可以通过如下命令进行恢复。

git checkout <hash code>
登入後複製
登入後複製

目前想到的就这些了,希望能有所帮助

个人博客:http://www.php.cn/

前言

作为一个开发者,如果现在还不知道git或者还不会使用git,那么你应该好好的反省。自己去好好看一遍的入门介绍吧。今天只是对自己在日常中使用git的一些常用命令的介绍与自己认为不错且能提高我们办公效率的命令。内容可能会有点杂乱,但绝对都是经典的命令,在此记下笔记,也希望能帮助来赏脸关顾的你们。

区域

在这之前,来介绍一下git的三个区域

  • 工作区(working directory)

  • 暂存区(stage index)

  • 本地历史区(history)

通过一张图就能简洁易懂的明白它们之间的转化。

git使用杂记

clone

先從clone指令來介紹,使用過git的都知道它。 git colne指令拉取遠端倉庫到本地。但當我們要拉取到指定的資料夾下時,你可能會直接mkdir,其實無需如此,一條指令就能搞定git clone 遠端倉庫 檔案名稱,就是如此簡單。

rm

我們在工作中可能會遇到這麼一種情況,使用git add .直接將工作區的所有修改的文件加入到暫存區了,但是後面發現有一個文件先不要加進去,此時我們就可以使用以下指令就可以將該檔案退回到工作區。

git rm --cached <file>
登入後複製
登入後複製

stash

有這麼一種情況,當你正在開發中時,有一個線上的緊急bug需要修復,此時開發中的功能又沒有完成你不想提交,此時你可以使用 git stash將工作區的文件都存放起來。這時你就可以放心的去切分支修復bug,修復完之後執行git stash pop可以將先前存放的取出,當然也有一些其他的相關命令例如:git stash list查看存放的記錄, git stash drop丟棄存放的記錄。

tag

可能在開發中我們要打標籤git tag tagName,並且要將對應的標籤推送到遠端倉庫中,此時可以使用以下命令進行推送。

git push --tags tagName
登入後複製
登入後複製

amend

當你commit以後,發現有一個文件沒有加進上次的commit中,或者又修改了一些文件。此時你並不想增加新的commit訊息,只是想將其加入到上次的commit中。這時你就可以使用

<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">git commit --amend &lt;file&gt;</pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>

將暫存區的文件加入其中,並且你也可以修改此時的commit資訊。

reset

reset也能實現前面的rm的效果,可以使用以下指令來取代前面的git rm --cached <file></file>指令

reee

reeegit rm --cached <file></file>指令reeereee soft參數可以回撤到任意的

commit

節點進行操作<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">git reset HEAD &lt;file&gt;</pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>執行該指令之後,就回到index處,工作區不變、暫存區回到當時的index處。另外還有一個

hard

參數。 <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">git reset --soft index</pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>

soft

可以說對立,它的效果就在於工作區與暫存區的不同,它會清空這兩個區。

rebase對於rebase是重定向的意思,如果你目前的分支與遠端的分支commit資訊有差異時,會提醒你此時不能進行push,必須先將遠端的commit 資訊拉去到本地來,才能進行提交。對於這種情況就可以使用rebase指令了。以下目前處在

develop

分支git使用杂记

此時應該先執行

rebase

指令<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">git reset --hard index</pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>執行完之後,最後再執行的效果了。如果覺得指令多難記,這裡也可用一條指令來完成上面的效果

git fetch
git rebase origin/master
登入後複製
登入後複製
這是

rebase

的簡單運用,也是常見的指令了。以下介紹

rebase的一個可選參數--onto--onto

使用場景:開發過程中我們都會創建不同的分支進行開發不同的功能,當你在分支

A

上創建了新分支

B進行開發功能並且也提交了一些commit 時,此時你發現原來A分支上有錯誤的commit,如果要rebasemaster上時,不能將這個錯誤的commit也附帶上。這時候就該--onto大顯神通了。

目前處在git使用杂记 B

分支,要得到上面的結果,只需執行如下命令

git push origin master
登入後複製
這個不僅可以針對不同的分支,也能作用於同一個分支上。所以針對上面的情況可以只對分支B進行操作,等價命令如下:

git pull --rebase origin master
登入後複製
--interactive當我們要修改

commit

資訊的名稱時,如果要修改的

commit處在第一個第。一個時,可以使用

git rebase --onto master <b的commit hash code> B
登入後複製
登入後複製
如果不是第一個時,我們就要使用到rebase的

--interactive可選參數了,可以簡寫為-i

git rebase --onto <a的commit hash code> <b的commit hash code> B
登入後複製
登入後複製
參數後面的commit hash code為需要修改的

commit的前一個。執行之後就會出現如下類似的訊息:

pick 137cf0a First coommit
pick 163dc38 Second commit

# Rebase f9aee6e..163dc38 onto f9aee6e (2 command(s))
#
# 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
登入後複製
登入後複製

根据提示我们可以有6个可选择的操作。相信提示已经说的很明显了,对于我们这种要修改First coommit的情况,需要使用r

r 137cf0a First commit
pick 163dc38 Second commit
登入後複製
登入後複製

执行之后会跳到修该First coomit的界面,进行修改即可。

First commit

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Thu Jan 26 23:07:10 2017 +0800
#
# rebase in progress; onto f9aee6e
# You are currently editing a commit while rebasing branch 'master' on 'f9aee6e'.
#
# Changes to be committed:
#       new file:   file1
登入後複製
登入後複製

至于其他的操作项,有兴趣的可以自己去尝试一下。例如s操作就可以用来合并commit

branch

相信branch都很熟悉,我这里要说的是他的另一种可能会用到的情况。场景是这样的:如果在你进行创建新的分支时,并不想从当前的commit信息节点进行创建分支。

git使用杂记

要实现如上效果只需在创建分支时在后面再添加额外的参数,该参数就是你所需调到的commit节点的hash code

git branch new_branch <commit hash code>
登入後複製
登入後複製

push

这里提一下push--set-upstream,它的效果是设置上游分支,当我们将远程不存在的本地分支推送到远程时,如果不在推送的分支上,我们一般会使用如下命令进行推送。

git checkout push_branch
git push origin push_branch
登入後複製
登入後複製

下面是简洁的方法,使用该参数无需切换分支,可以直接使用如下命令进行推送。

git push --set-upstream origin push_branch
登入後複製
登入後複製

cherry-pick

这个命令的场景是:当你所在的分支没用,你要删除它,但其中的一个commit你还是想推送到远程master上。

git使用杂记

将分支切换到master,执行以下命令:

git cherry-pick <b的 commit hash code>
登入後複製
登入後複製

merge

我们所熟知的是使用merge来进行分支的合并,每次使用merge时都会自动将副分支合并成一个commit进行推送到主分支上,那么如果我不想它自动推送到主分支上时(可能我还需要进行修改),这时就可以使用--squash操作

git merge --squash dev_branch
登入後複製
登入後複製

执行完以上命令后,我们就可以在暂存区看到一个还未提交的文件状态。

reflog

当我们切分支太频繁了之后,可能会忘了一些分支是从哪个分支切过来的,此时可以使用如下命令查看:

git reflog
登入後複製
登入後複製
894a16d HEAD@{0}: commit: commit another todo
6876e5b HEAD@{1}: checkout: moving from solve_world_hunger to kill_the_batman
324336a HEAD@{2}: commit: commit todo
6876e5b HEAD@{3}: checkout: moving from blowup_sun_for_ransom to solve_world_hunger
6876e5b HEAD@{4}: checkout: moving from kill_the_batman to blowup_sun_for_ransom
6876e5b HEAD@{5}: checkout: moving from cure_common_cold to kill_the_batman
6876e5b HEAD@{6}: commit (initial): initial commit
登入後複製
登入後複製

这样我们就可以看到所用的操作历史了。这样如果我们使用git reset命令不小心删除了需要的东西。可以通过此来查找到删除操作的hash code,之后就可以通过如下命令进行恢复。

git checkout <hash code>
登入後複製
登入後複製

目前想到的就这些了,希望能有所帮助

更多git使用杂记 相关文章请关注PHP中文网!

相關標籤:
git
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板