整理的Git用法技巧大全

七个你无法忽视的 Git 使用技巧

与其他技术相比,Git应该拯救了更多开发人员的饭碗。只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷糊糊犯下的错误。

尽管这么说,Git的命令行界面可是出了名的难掌握。接下来,就给大家介绍7个小技巧,最大限度发挥Git的作用。

通常,大部分时间我们都只会用到

add

commit

branch

push

/

pull

这些命令。大部分人熟悉这套只往一个方向运转的工作流。你们有没有想过,如果自己往仓库中添加了错误的文件,或是将代码提交到了错误的分支,而且提交信息还写错了的话,自己怎样才能取消之前的操作?如果你也是按照上面漫画中所描绘的一样操作的(即删除本地项目文件夹,再重新下载仓库),那么你就有必要了解下面这些Git使用技巧了。

1. 修改错误的提交信息(commit message)

提交信息很长时间内会一直保留在你的代码库(code base)中,所以你肯定希望通过这个信息正确地了解代码修改情况。 下面这个命令可以让你编辑最近一次的提交信息,但是你必须确保没有对当前的代码库(working copy)做修改,否则这些修改也会随之一起提交。

$ git commit --amend -m ”YOUR-NEW-COMMIT-MESSAGE”

假如你已经将代码提交(git commit)推送(git push)到了远程分支,那么你需要通过下面的命令强制推送这次的代码提交。

$ git push <remote> <branch> --force

你可以关注Stack Overflow网站上的这条问答, 获取更多详情。

2. 提交之前撤销 git add

如果你往暂存区(staging area)中加入了一些错误的文件,但是还没有提交代码。你可以使用一条简单的命令就可以撤销。如果只需要移除一个文件,那么请输入:

$ git reset <文件名>

或者如果你想从暂存区移除所有没有提交的修改:

$ git reset

你可以关注Stack Overflow网站上的这条问答, 获取更多详情。

3. 撤销最近一次代码提交

有时候你可能会不小心提交了错误的文件或一开始就遗漏了某些东西。下面这三步操作可以帮助你解决这个问题。

$ git reset --soft HEAD~1
# 对工作文件进行必要的更改
$ git add -A .
$ git commit -c ORIG_HEAD

你执行第一个命令时,Git会将

HEAD

指针后移到此前的一次提交,之后你才能移动文件或作必要的修改。

然后你就可以添加所有的修改,而且当你执行最后的命令时,Git会打开你的默认文本编辑器,其中会包含上一次提交时的信息。如果愿意的话,你可以修改提交信息,或者你也可以在最后的命令中使用

-C

而不是

-c

,来跳过这一步。

4. Git仓库撤销至前一次提交时的状态

“撤销”(revert)在许多情况下是非常有必要的——尤其是你把代码搞的一团糟的情况下。最常见的情况是,你想回到之前代码版本,检查下那个时候的代码库,然后再回到现在状态。这可以通过下面的命令实现:

$ git checkout <SHA>

“”是你想查看的提交拥有的哈希值(Hash Code)中前8至10个字符。 这个命令会使

<HEAD>

指针脱离(detach),可以让你在不检出(check out)任何分支的情况下查看代码——脱离HEAD并不像听上去那么可怕。如果你想在这种情况下提交修改,你可以通过创建新的分支来实现:

$ git checkout -b <SHA>

要想回到当前的工作进度,只需要检出(check out)你之前所在的分支即可。

你可以关注Stack Overflow网站上的这条问答, 获取更多详情。

5. 撤销合并(Merge)

要想撤销合并,你可能必须要使用恢复命令(HARD RESET)回到上一次提交的状态。“合并”所做的工作基本上就是重置索引,更新working tree(工作树)中的不同文件,即当前提交()代码中与

HEAD

游标所指向代码之间的不同文件;但是合并会保留索引与working tree之间的差异部分(例如那些没有被追踪的修改)。

$ git checkout -b <SHA>

当然,Git中总是有其他的实现办法,你可以查看看这篇文章继续了解。

6. 从当前Git分支移除未追踪的本地文件

假设你凑巧有一些未被追踪的文件(因为不再需要它们),不想每次使用

git status

命令时让它们显示出来。下面是解决这个问题的一些方法:

$ git clean -f -n         # 1
$ git clean -f            # 2
$ git clean -fd           # 3
$ git clean -fX           # 4
$ git clean -fx           # 5

(1): 选项-n将显示执行(2)时将会移除哪些文件。

(2): 该命令会移除所有命令(1)中显示的文件。

(3): 如果你还想移除文件件,请使用选项-d。

(4): 如果你只想移除已被忽略的文件,请使用选项-X。

(5): 如果你想移除已被忽略和未被忽略的文件,请使用选项-x。

请注意最后两个命令中X的区别。

更多详情,请查看官方文档中关于git-clean的介绍。

7. 删除本地和远程Git分支

删除本地分支:

$ git branch --delete --force <branchName>

或者使用选项-D作为简写:

$ git branch -D

删除远程分支:

$ git push origin --delete <branchName>

建议:要想更好地掌握Git的用法,请仔细阅读Git官方文档。

12个git实战建议和技巧

1.使用“git diff”来折叠多行

用git diff经常会出现很多内容,导致很多内容被遮住了,让人很是苦恼,幸运的是这里有个解决方案。

如果你使用less作为默认的pager,只需要输入-s,就可以保证不会被diff刷屏了。

或者,你也可以使用git config设置pager来达到同样的效果:

为当前项目设置pager:

    $ git config core.pager 'less -r'  

再将pager设置的作用域设置为整个项目:

    $ git config --global core.pager 'less -r'  

2.设置全局代理

在某些网络环境下,你可能需要为git配置代理,这很简单,只需要一行命令就可以了:

    git config --global https.proxy https://user:password@address:port

3.clone某个特定分支

在某些大型项目中,或者只是图方便,有时候你可能只希望clone某个分支,你可以这样做:

    mkdir $BRANCH
    cd $BRANCH
    git init
    git remote add -t $BRANCH -f origin $REMOTE_REPO
    git checkout $BRANCH

4.比较某个文件和远程分支上的区别

很简单:

    git diff localbranch remotebranch filepath

5.列出版本库中所有已删除的文件

也许你是想将其恢复,因此需要仔细确认某些merge操作,无论如何,列出版本库中所有已删除的文件会非常有帮助。你只需要这样做:

    git log --diff-filter=D --summary

如果你想将其恢复,参照这里。

如果你不想知道是哪次commit中删除的,只需要添加一个grep delete。

    git log --diff-filter=D --summary | grep delete

6.在版本库所有版本中搜寻一条字符串

往往你想要查找某段代码、某个函数、一个常量、一个文件,但是却找不到了。它被删除了,什么时候删除的?这个小技巧能搜索整个版本库中git diff信息,可能会花些时间,但是非常有用:

    git rev-list --all | (
        while read revision; do
            git grep -F 'Your search string' $revision
        done
    )

7.应用另外一个(不相关的)本地版本库中的patch

从另一个版本库中cherry-pick一条提交记录,首先需要将那个版本库作为一个远程版本库添加进来,并fetch其变化,然后cherry-pick其提交记录。

如果你追求速度,也可以使用这个未经优化的命令:

    git --git-dir=../some_other_repo/.git format-patch -k -1 --stdout <commit SHA>| git am -3 -k

8.从新的主干中分出一个新分支

有时候你会在better_brach上工作一段时间,并准备将其设为新的master,你会怎么做?

这里是Stack Overflow上提供的常规解决方案:

1.切换到better_brach分支:

    git checkout better_branch

2.保留better_branch分支全部内容,但是记录合并:

    git merge --strategy=ours master

3.切回mater

    git checkout master

4.快速合并

    git merge better_branch

5.如果你想让合并步骤变得更清晰,可以添加commit信息。只需要修改下第二步:

    git merge --strategy=ours --no-commit master
    git commit # Here add your custom message to the commit template

9.向分支提交一个初始的空commit,保证完全复位

这样会重写历史记录,所以只能在未和任何人分享前做,否则将可能把同事者的文件破坏。

1.创建一个新的空分支,例如:newroot

    git checkout --orphan newroot
    git rm --cached -r .
    git clean -f -d

2.创建空的commit

    git commit --allow-empty -m '[empty] initial commit'

3.重新发送分支的全部内容

    git rebase --onto newroot --root master

4.删除临时分支newroot

    git branch -d newroot

现在master就已经包含了一个空的root commit了。

10.清空一个分支来做些不同的事

有时候你会想要从某个分支重新开始,或者打算保留一些逻辑上和主干相关但是跟踪另一个跨职能方面的代码,就像GitHub项目的gh-pages。

但如果你只想重新开始某个分支,清空所有历史记录呢?

1.检出(checkout)一个分支:

    git checkout -b branch_to_zero

2.跟上条一样,先建立增加一个初始的空commit,之后就可以通过重新设置来清空一个分支。

3.使用hard重置分支到刚刚创建的初始commit:

    git reset --hard initial_commit

11.如何修改一个特定的commit?

当你想在推送前重做你最后的commit时,可以使用修改命令(git commit --amend)。如果你想修改的不是最后一个commit呢?

这种情况下,你可以使用git rebase,例如,你想要修改bbc643cd commit,运行下面的命令:

    $git rebase bbc643cd^ --interactive  

在默认的编辑器中选择并修改你期望修改的,然后保存修改并输入:

    $ git add <filepattern>  

现在你就可以使用

    $git commit --amend

来修改commit,之后使用

    $ git rebase --continue  

返回之前最新的commit。

12.如何隐藏多个已修改文件中一个?

git stash --keep-index命令可以用来隐藏上次commit中没有add的东西,之后add想要提交的文件并运行相应命令就可以了。

按照下面的提示,你可以把一条老的commit提交到多个变更集中:

互动地rebase最后一条好的commit:

    git rebase -i last_good_commit

将某些变化标记为edit:

    git reset HEAD^
    git add file1 file2 file3

添加相应的文件:

    git add file1 file2 file3

因此之前没有添加的文件:

    git stash --keep-index

别忘了收尾:

    git commit
    git stash pop

有必要的话,重复第二步之后的步骤:

    git rebase --continue

    

    
25个Git用法技巧

基本技巧

1.安装后的第一步

安装git后,第一件事你需要设置你的名字和邮箱,因为每次提交都需要这些信息。

$ git config --global user.name "Some One"
$ git config --global user.email "someone@gmail.com"

2.是基于指针的

git上的所有东西都是储存在文件里的,当你创建一次提交时,它会创建一个包含你的提交信息和相关数据(名字,邮箱,日期/时间、上一次提交等等)的文件并连接一个树文件,而这个树文件包含了对象列表或者其他树。这上面的对象或者blob文件就是这次提交的实际内容(你可以认为这也是一个文件,尽管并没有储存在对象里而是储存在树中)。所有的文件都以经过SHA-1计算后的文件名(译者注:经过SHA-1计算后的数,即git中的版本号)储存在上面。

从这里可以看出,分支和标签都是包含一个指向这次提交的sha-1数(版本号)简单的文件,这样使用引用会变得更快和更灵活,创建一个新的分支是就像创建文件一样简单,SHA ? 1数(版本号)也会引用你这个分支的提交。当然,如果你使用GIT命令行工具(或者GUI)你将无法接触这些。但真的很简单。

你可能听说过HEAD引用,这是一个指向你当前提交的内容的SHA-1 数(版本号)的指针。如果你正在解决合并冲突,使用HEAD不会对你的特定分支有任何改动只会指向你当前的分支。

所有分支的指针都保存在 .git/refs/heads,HEAD指针保存在.git/HEAD,标签则保存在 .git/refs/tags,有时间就去看看吧。

3. 两个母体(Parent),当然

当我们在日志文件中查看合并提交信息,你会看到两个母体,第一个母体是正在进行的分支,第二个是你要合并的分支。

4.合并冲突

现在,我发现有合并冲突并解决了它,这是一件在我们编辑文件时很正常的事。将 <<<<, ====, >>>> 这些标记移除后,并保存你想要保存的代码。有些时候在代码被直接替代之前,能看到冲突是件挺不错的事。比如在两个冲突的分支变动之前,可以用这样的命令方式:

$ git diff --merge
diff --cc dummy.rb  
index 5175dde,0c65895..4a00477  
--- a/dummy.rb
+++ b/dummy.rb
@@@ -1,5 -1,5 +1,5 @@@
  class MyFoo
    def say
-     puts "Bonjour"
 -    puts "Hello world"
++    puts "Annyong Haseyo"
    end
  end

If the file is binary, diffing files isn’t so easy… What you’ll normally want to do is to try each version of the binary file and decide which one to use (or manually copy portions over in the binary file’s editor). To pull a copy of the file from a particular branch (say you’re merging master and feature132):

如果是二进制文件(binary),区别这些文件并不容易。通常你会查看每个二进制文件的版本,再决定使用哪个(或者在二进制文件编辑器中手动复制),并将其推送至特定的分支。(比如你要合并master和feature132)

$ git checkout master flash/foo.fla # or...
$ git checkout feature132 flash/foo.fla
$ # Then...
$ git add flash/foo.fla

Another way is to cat the file from git ? you can do this to another filename then copy the correct file over (when you’ve decided which it is) to the normal filename:

另一个方法就是在git中cat文件,你可以将其命名为另一个文件名,然后将你决定的那个文件改为正确的文件名:

$ git show master:flash/foo.fla > master-foo.fla
$ git show feature132:flash/foo.fla > feature132-foo.fla
$ # Check out master-foo.fla and feature132-foo.fla
$ # Let's say we decide that feature132's is correct
$ rm flash/foo.fla
$ mv feature132-foo.fla flash/foo.fla
$ rm master-foo.fla
$ git add flash/foo.fla

更新:感谢carls在原博评论中提醒我,可以使用 “git checkout —ours flash/foo.fla” 和“git checkout —theirs flash/foo.fla” 在不用考虑你需要合并的分支来检查指定版本,就我个人而言,我喜欢更明确的方法,但这也是一个选择…

记住,解决完合并冲突后要添加文件。(我之前就犯过这样的错误)

服务,分支和标注

5. 远程服务

Git有一个非常强大的特性,就是可以有多个远程服务端(以及你运行的一个本地仓库)。你不需要总是进行访问,你可以有多个服务端并能从其中一个(合并工作)读取再写入另一个。添加一个远程服务端很简单:

$ git remote add john git@github.com:johnsomeone/someproject.git

If you want to see information about your remote servers you can do:

如果你想查看远程服务端的信息你可以:

# shows URLs of each remote server
$ git remote -v

# gives more details about each
$ git remote show name

You can always see the differences between a local branch and a remote branch:

你总是能看到本地分支和远程分支不同的地方:

$ git diff master..john/master

You can also see the changes on HEAD that aren’t on that remote branch:

你同样也能看到远程分支上没有的HEAD指针的改动:

$ git log remote/branch..
# Note: no final refspec after ..

6. Tagging 标签

在Git中有两种类型的标注:轻量级标注和注释型标注。

记住第二个是Git的指针基础,两者区别很简单,轻量级标注是简单命名提交的指针,你可以将其指向另一个提交。注释型标注是一个有信息和历史并指向标注对象的名字指针,它有着自己的信息,如果需要的话,可以进行GPG标记。

创建两种类型的标签很简单(其中一个命令行有改动)

$ git tag to-be-tested
$ git tag -a v1.1.0 # Prompts for a tag message

7. Creating Branches 创建分支

在git中创建分支是件非常简单的事情(非常快并只需要不到100byte的文件大小)。创建新分支并切换到该分支,通常是下面这样的:

$ git branch feature132
$ git checkout feature132

当然,如果你想切换到该分支,最直接的方式是使用这样一条命令:

$ git checkout -b feature132

如果你想要重新命名本地分支,也很简单:

$ git checkout -b twitter-experiment feature132
$ git branch -d feature132

更新:或者你(Brian Palmer在原博的评论中指出的)可以使用 -m来切换到“git branch”(就像Mike指出,如果你只需要一个特定的分支,就可以重命名当前分支)

$ git branch -m twitter-experiment
$ git branch -m feature132 twitter-experiment

8.合并分支

以后你可能回想合并你的变动,有两种方式可以做到这一点:

$ git checkout master
$ git merge feature83 # Or...
$ git rebase feature83

merge和rebase的区别是,merge会尝试解决改动并创建的新的提交来融合他们。rebase则是将从你最后一次从另一个分支分离之后的改动并入,并直接沿用另一个分支的head指针。尽管如此,在你往远端服务器上推送分支之前,不要使用rebase。这会让你混乱。

如果你不能确定哪个分支(哪些需要合并,哪些需要移除)。这里有两个git分支切换方式来帮助你:

# Shows branches that are all merged in to your current branch
$ git branch --merged

# Shows branches that are not merged in to your current branch
$ git branch --no-merged

9.远程分支

如果你想将本地分支放置远程服务端,你可以用这条命令进行推送:

$ git push origin twitter-experiment:refs/heads/twitter-experiment
# Where origin is our server name and twitter-experiment is the branch

如果你想要从服务端删除分支:

$ git push origin :twitter-experiment

如果你想要查看远程分支的状态:

$ git remote show origin

这将列出那些曾经存在而现在不存在的远程分支,这将帮助你轻易地删除你本地多余的分支。

$ git remote prune

最后,如果本地追踪远程分支,常用方式是:

$ git branch --track myfeature origin/myfeature
$ git checkout myfeature

尽管这样,Git的新版本将启动自动追踪,如果你使用-b来checkout:

$ git checkout -b myfeature origin/myfeature

Storing Content in Stashes, Index and File System 在stash储存内容、索引和文件系统

10. Stashing

在Git中你可以将当前的工作区的内容保存到Git栈中并从最近的一次提交中读取相关内容。以下是个简单的例子:

$ git stash
# Do something...
$ git stash pop

很多人推荐使用git stash apply来代替pop。这样子恢复后储存的stash内容并不会删除,而‘pop’恢复的同时把储存的stash内容也删了 ,使用git stash apply 就可以移除任何栈中最新的内容。

<code data-language="javascript">$ git stash drop
</code>

git可以自动创建基于当前提交信息的指令,如果你更喜欢使用通用的信息(相当于不会对前一次提交做任何改动)

<code data-language="javascript">$ git stash save "My stash message"
</code>

如果你想使用某个stash(不一定是最后一个),你可以这样将其列表显示出来然后使用:

<code data-language="javascript">$ git stash list
  stash@{0}: On master: Changed to German
  stash@{1}: On master: Language is now Italian
$ git stash apply stash@{1}
</code>

11.添加交互

在svn中,如果你文件有了改动之后,然后会提交所有改动的文件,在 Git中为了能更好的提交特定的文件或者某个补丁,你需要在交互模式提交选择提交的文件的内容。

$ git add -i
staged     unstaged path

*** Commands ***
  1: status      2: update   3: revert   4: add untracked
  5: patch      6: diff     7: quit     8: help
What now&gt;

这是基于菜单的交互式提示符。您可以使用命令前的数字或进入高亮字母(如果你有高亮输入)模式。常用形式是,输入你想执行的操作前的数字。(你可以像1或1 ? 4或2、4、7的格式来执行命令)。

如果你想进入补丁模式(在交互模式中输入p或5),同样也可以这样操作:

$ git add -p    
diff --git a/dummy.rb b/dummy.rb  
index 4a00477..f856fb0 100644  
--- a/dummy.rb
+++ b/dummy.rb
@@ -1,5 +1,5 @@
 class MyFoo
   def say
-    puts "Annyong Haseyo"
+    puts "Guten Tag"
   end
 end
Stage this hunk [y,n,q,a,d,/,e,?]?

如你所见,你将在选择添加改动的那部分文件的底部获得一些选项。此外,使用“?”会说明这个选项。

12. 文件系统中的储存/检索

有些项目(比如Git自己的项目)需要直接在Git的文件系统中添加额外的并不想被检查的文件。

让我们开始在Git中保存随机文件

$ echo "Foo" | git hash-object -w --stdin
51fc03a9bb365fae74fd2bf66517b30bf48020cb

比如数据库中的对象,如果你不想让一些对象被垃圾回收,最简单的方式是给它加标签:

$ git tag myfile 51fc03a9bb365fae74fd2bf66517b30bf48020cb

在这里我们设置myfile的标签,当我们需要检索该文件时可以这样:

$ git cat-file blob myfile

这对开发者可能需要的但是并不想每次都去检查的有用文件(密码,gpg键等等)很管用(特别是在生产过程中)。
Logging and What Changed? 记录日志和什么改变了?

13. 查看日志

在不使用“git log”的情况下,你不能查看你长期的最近提交内容,但是,仍然有一些更便于你使用的方法,比如,你可以这样查看单次提交变动的内容:

$ git log -p

或者你只看文件变动的摘要:

$ git log --stat

这个很赞的别名,可以让你在一行命令下简化提交,并展示不错的图形化分支。

$ git config --global alias.lol "log --pretty=oneline --abbrev-commit --graph --decorate"
$ git lol
* 4d2409a (master) Oops, meant that to be in Korean
* 169b845 Hello world

14.在日志中查找

如果你想根据指定的作者查找:

$ git log --author=Andy

更新:感谢 Johannes的评论,解除了我的一些困惑,

或者你可以搜索你提交信息的内容:

$ git log --grep="Something in the message"

这些强大的指令被称为pickaxe指令,来检查被移除或添加特定块的内容(比如,当他们第一次出现或者被移除),添加任何一行内容都会告诉你(但是并不包括那行内容刚刚被改动)

$ git log -S "TODO: Check for admin status"

如果你改动一个特定的文件会怎么样?如:lib/foo.rb

$ git log lib/foo.rb

如果你有feature/132 和ferature/145这两个分支,并想查看这些不在master上的分支内容。( ^ 符号是意味着非)

$ git log feature/132 feature/145 ^master

你同样可以使用ActiveSupport风格的日期来缩短时间范围:

$ git log --since=2.months.ago --until=1.day.ago

默认会使用OR来合并查询,但你也可改用AND(如果你有不止一个条件)

$ git log --since=2.months.ago --until=1.day.ago --author=andy -S "something" --all-match

15.选择试图/改动的之前的版本。

根据你知道的信息,可以按照以下方式来找到之前的版本:

$ git show 12a86bc38 # By revision
$ git show v1.0.1 # By tag
$ git show feature132 # By branch name
$ git show 12a86bc38^ # Parent of a commit
$ git show 12a86bc38~2 # Grandparent of a commit
$ git show feature132@{yesterday} # Time relative
$ git show feature132@{2.hours.ago} # Time relative

注意:不像前一部分所说,在最后的插入符号意味着提交的父类,在前面的插入符号意味着不在这个分支上。

16. 选择一个方式

最简单的方式:

$ git log origin/master..new
# [old]..[new] - everything you haven't pushed yet

你也可以省略[new],这样将默认使用当前的HEAD指针。
Rewinding Time & Fixing Mistakes 回滚和修复错误
17.重置更改

如果你没有提交你可以简单的撤销改动:

$ git reset HEAD lib/foo.rb

通常我们使用”unstage“这样的别名来代替:

$ git config --global alias.unstage "reset HEAD"
$ git unstage lib/foo.rb

如果你已经提交了,有两种情况:如果是最后一次提交你仅仅需要amend:

$ git commit --amend

这将不执行最后一次提交,恢复你原来的内容,提交信息将默认为你下次提交的信息。

如果你已经提交过不止一次了并且想完全回到之前那个记录,你可以重置分支回到指定的时间。

$ git checkout feature132
$ git reset --hard HEAD~2

如果你想将分支回滚但想要SHA1数(版本号)不一样(也许你可以将分支的HEAD指向另一个分支,或者之后的提交),你可以通过如下方式:

$ git checkout FOO
$ git reset --hard SHA

实际上还有个更快的方式(这样并不会改变你的文件复制内容,并回归到第一次FOO的状态并指向SHA)

$ git update-ref refs/heads/FOO SHA

18. 提交至错误的分支

好吧,假定你提交到master上了,但是你想提交的是名为experimental的主题分支上,如果想移除这个改动,你可以在当前创建一个分支并将head指针回滚再检查新的分支

$ git branch experimental   # Creates a pointer to the current master state
$ git reset --hard master~3 # Moves the master branch pointer back to 3 revisions ago
$ git checkout experimental

如果你在分支的分支的分支进行了改动将会很麻烦,那么你需要做的就是在其他处进行分支rebase改动

$ git branch newtopic STARTPOINT
$ git rebase oldtopic --onto newtopic

19. rebase的交互

这是个很不错的功能,我曾看过演示但一直以来并没有真正搞懂,现在我知道了,非常简单。假如你进行了三次提交,但是你想重新编辑它们(或者结合它们)。

$ git rebase -i master~3

然后你让你的编辑器打开一些指令,你需要做的就是修改指令来选择/squash/编辑(或删除)/提交和保存/退出,编辑完使用git rebase —continue 来通过你的每一个指令。

如果你选择编辑一个,它将离开你的提交状态,所以你需要使用git commit -amend来编辑它。

注意:不要在rebase的时候提交——只能添加了之后再使用—continue, —skip 或—abort.

20. 清除

如果你在分支中提交了一些内容(也许是一些SVN上老的资源文件)并想从历史记录中完全移除,可以这样:

$ git filter-branch --tree-filter 'rm -f *.class' HEAD

如果你已经将其推送至origin,并提交了一些垃圾内容,你同样可以推送之前在本地系统这样做:

$ git filter-branch --tree-filter 'rm -f *.class' origin/master..HEAD

Miscellaneous Tips 各种各样的技巧

21.你看过的前面的引用

如果你知道你之前看到的SHA-1数(版本号),并需要进行一些重置/回滚,可以使用reflog命令查询最近查看的sha ? 1数(版本号):

$ git reflog
$ git log -g # Same as above, but shows in 'log' format

22. 分支命名

一个有趣的小技巧,不要忘记分支名不仅仅限于a-z和0-9,在名字中使用/和.用于命名伪命名空间和版本控制,也是个不错的主意,例如:

$ # Generate a changelog of Release 132
$ git shortlog release/132 ^release/131
$ # Tag this as v1.0.1
$ git tag v1.0.1 release/132

23. 找到Dunnit

找出谁在一个文件中改变了一行代码,简单的命令是:

$ git blame FILE

有时候是上一个文件发生了变动(如果你合并两个文件,或者你已经转移到一个函数),这样你就可以使用:

$ # shows which file names the content came from
$ git blame -C FILE

有时候需要通过点击来追踪来回的变动,这里有一个不错的内置gui:

$ git gui blame FILE

24. 数据库维护

通常Git并不需要过多的维护,它几乎可以自己搞定,尽管如此你也可以查看数据库使用的统计:

$ git count-objects -v

如果数值过高你可以选择将你的克隆垃圾回收。这不会影响你推送内容或其他人,但它可以让你的命令运行的更快,并使用更少的空间:

$ git gc

它也可以在运行时进行一致性检验:

$ git fsck --full

你可以在后面添加-auto 参数(如果你在服务器跑定时任务时),这在统计数据时是必须的。

当检查的结果是“dangling”或“unreachable”这样的是正常的,这通常是回滚和rebase的结果。 得到“missing” 或 “sha1 mismatch” 这样的结果是不好的…你需要得到专业的帮助!

25. 恢复失去的分支

如果你意外的删除一个分支,可以重新创建它:

$ git branch experimental SHA1_OF_HASH

你可以使用git reflog查看你最近访问过的SHA1数(版本号)

另一个方式就是使用 git fsck —lost-found ,悬空对象(dangling commit )是就是失去HEAD指针的提交,(删除的分支只是失去了HEAD指针成为悬空对象)

Done!完成!

时间: 2024-08-29 10:23:34

整理的Git用法技巧大全的相关文章

让SSD速度飞起来 固态硬盘优化技巧大全

  让SSD速度飞起来 固态硬盘优化技巧大全 不过SSD其它方面优势却明显,所以已经成为多数用户装机的必配硬件了.在使用方面,SSD与传统的HDD还是略有不同的,想要让SSD真正发挥出它的性能,必须得经过一系列的设置才行.例如开启AHCI,4K对齐,安装专用驱动,使用原生SATA3.0接口等等,要比传统的HDD复杂一些.从大量的评测的数据不难看出,不当的使用方法,会极大的影响到SSD的性能跟寿命.所以适当了解SSD的一些常用小知识,就可以更好的发挥出SSD的性能. 1:SSD不同接口安装展示 目

摄影技能技巧大全 - 太精彩啦,年后弄个单反按着练练!

[珍藏孤版]摄影技能技巧大全   (2013-07-13 12:19:29) 转载▼ 标签:  转载   学而时习之,不亦说乎. 原文地址:[珍藏孤版]摄影技能技巧大全作者:吴雁 摄影技能技巧大全 摄影五字歌   摄影学不难,易学用单反,熟读说明书,功能要记全. 光圈配快门,曝光要先练,找准中间灰,白加黑就减. 小光圈景深,远近都能看,若想虚背景,大光圈景浅. 相机须持稳,摄姿要规范,善用三角架,不怕快门慢, 快门凝瞬间,慢门显动感.短焦视角广,长焦压空间, 望远景深浅,微距景更短.广角易畸变,

七个你无法忽视的 Git 使用技巧

与其他技术相比,Git应该拯救了更多开发人员的饭碗.只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷糊糊犯下的错误. 尽管这么说,Git的命令行界面可是出了名的难掌握.接下来,就给大家介绍7个小技巧,最大限度发挥Git的作用. 通常,大部分时间我们都只会用到add.commit.branch和push/pull这 些命令.大部分人熟悉这套只往一个方向运转的工作流.你们有没有想过,如果自己往仓库中添加了错误的文件,或是将代码提交到了错误的

七个你无法忽视的Git使用技巧(转)

与其他技术相比,Git应该拯救了更多开发人员的饭碗.只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷糊糊犯下的错误. 尽管这么说,Git的命令行界面可是出了名的难掌握.接下来,就给大家介绍7个小技巧,最大限度发挥Git的作用. 通常,大部分时间我们都只会用到add.commit.branch和push/pull这 些命令.大部分人熟悉这套只往一个方向运转的工作流.你们有没有想过,如果自己往仓库中添加了错误的文件,或是将代码提交到了错误的

七个你无法忽视的Git使用技巧

与其他技术相比,Git应该拯救了更多开发人员的饭碗.只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷糊糊犯下的错误. 尽管这么说,Git的命令行界面可是出了名的难掌握.接下来,就给大家介绍7个小技巧,最大限度发挥Git的作用. 通常,大部分时间我们都只会用到add.commit.branch和push/pull这 些命令.大部分人熟悉这套只往一个方向运转的工作流.你们有没有想过,如果自己往仓库中添加了错误的文件,或是将代码提交到了错误的

QQ拼音输入法英文输入技巧大全

  使用过QQ拼音输入法的亲们,应该都知道QQ拼音输入法有五种英文输入方式,它那输入方式的灵活多样多种方式 让很多用户都留下深刻的印象哦.那么,如何在QQ拼音输入法更有效率的使用英文输入呢?今天小编就给大家简单介绍下QQ拼音输入法英文输入的技巧大全. QQ拼音输入法 QQ拼音输入法英文输入技巧大全: 1.中英文混合模式 对于想要更快捷准确的输入中英文的人来说,中.英文之间的热键切换绝对是个绊脚石.而在QQ拼音输入法的混合输入模式下,输入法切换已经成为了过去.QQ拼音可以通过算法来智能判断用户的输

Excel打印技巧大全

Excel打印技巧大全 收集了Excel中关于打印的各种技巧,让你精通Excel打印工作.试试看,以下的Excel打印技巧你知道几个? 没有打印机一样可以打印预览 在没有安装打印机的电脑上按下Excel的"打印预览"按钮后,Excel会却提示没有安装打印机,且无法打印预览.其实,只要单击"开始"→ "设置"→"打印机",然后双击"添加打印机"项目,再随便安装一个打印机的驱动程序.重启Excel,就会发现已经

在word2007中选择文本技巧大全

在word2007文档中在对文本进行操作的时候,大多数都需先选择要操作文本,才能进行相应的操作.选择文本的时候,我们通常使用按住鼠标拖动的方法选择文本.下面再列举一些选择文本的技巧 ★选择文档中的一句话:按住Ctrl键,并在这句话任意地方单击鼠标左键,即可选中该句话.不过需要注意的是,这里说的一句话指的是句号.分号.冒号.感叹号等两者之间的文字,但不包括逗号.引号.顿号等 ★选择文档中的多句话:按住Shift键不放,并在你要选择的起始处单击鼠标左键,然后在你要选择的结尾处单击鼠标左键. ★选择文

淘宝卖家必读 经典的Photoshop技巧大全

学PS基础:Photoshop 技能167个,经典的Photoshop技巧大全,如果你是初级阶段的水平,熟读此文并掌握,马上进阶为中级水平.常见技巧 经典的Photoshop技巧大全,如果你是初级阶段的水平,熟读此文并掌握,马上进阶为中级水平. 1. 快速打开文件 双击Photoshop的背景空白处(默认为灰色显示区域)即可打开选择文件的浏览窗口. 2. 随意更换画布颜色 选择油漆桶工具并按住Shift点击画布边缘,即可设置画布底色为当前选择的前景色.如果要还原到默认的颜色,设置前景色为25%灰