`
yanguz123
  • 浏览: 568130 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

git常用命令收集

    博客分类:
  • IT
 
阅读更多

 

基本技巧

 

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/headsHEAD指针保存在.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),区别这些文件并不容易。通常你会查看每个二进制文件的版本,再决定使用哪个(或者在二进制文件编辑器中手动复制),并将其推送至特定的分支。(比如你要合并masterfeature132

 

$ 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:

 

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

 

$ 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

 

mergerebase的区别是,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的新版本将启动自动追踪,如果你使用-bcheckout

 

$ 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 就可以移除任何栈中最新的内容。

 

$ git stash drop

 

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

 

$ git stash save "My stash message"

 

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

 

$ git stash list

 

  stash@{0}: On master: Changed to German

 

  stash@{1}: On master: Language is now Italian

 

$ git stash apply stash@{1}

 

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>

 

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

 

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

 

$ 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-z0-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!完成!

 

 

 

 

 

 

 

 

Git命令参考手册(文本版)

 

git init  #初始化本地git仓库(创建新仓库)

 

git config --global user.name "xxx"   #配置用户名

 

git config --global user.email "xxx@xxx.com"  #配置邮件

 

git config --global color.ui true  #git status等命令自动着色

 

git config --global color.status auto

 

git config --global color.diff auto

 

git config --global color.branch auto

 

git config --global color.interactive auto

 

git clone git+ssh://git@192.168.53.168/VT.git  #clone远程仓库

 

git status  #查看当前版本状态(是否修改)

 

git add xy  #添加xyz文件至index

 

git add .  #增加当前子目录下所有更改过的文件至index

 

git commit -m 'xxx'   #提交

 

git commit --amend -m 'xxx'   #合并上一次提交(用于反复修改)

 

git commit -am 'xxx'  #addcommit合为一步

 

git rm xxx  #删除index中的文件

 

git rm -r *  #递归删除

 

git log  #显示提交日志

 

git log -1  #显示1行日志 -nn

 

git log -5

 

git log --stat   #显示提交日志及相关变动文件

 

git log -p -m

 

git show dfb02e6e4f2f7b573337763e5c0013802e392818   #显示某个提交的详细内容

 

git show dfb02  #可只用commitid的前几位

 

git show HEAD  #显示HEAD提交日志

 

git show HEAD^  #显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本

 

git tag  #显示已存在的tag

 

git tag -a v2.0 -m 'xxx'  #增加v2.0tag

 

git show v2.0   #显示v2.0的日志及详细内容

 

git log v2.0  #显示v2.0的日志

 

git diff   #显示所有未添加至index的变更

 

git diff --cached  #显示所有已添加index但还未commit的变更

 

git diff HEAD^   #比较与上一个版本的差异

 

git diff HEAD -- ./lib   #比较与HEAD版本lib目录的差异

 

git diff origin/master..master   #比较远程分支master上有本地分支master上没有的

 

git diff origin/master..master --stat  #只显示差异的文件,不显示具体内容

 

git remote add origin git+ssh://git@192.168.53.168/VT.git #增加远程定义(用于push/pull/fetch

 

git branch  #显示本地分支

 

git branch --contains 50089    #显示包含提交50089的分支

 

git branch -a   #显示所有分支

 

git branch -r   #显示所有原创分支

 

git branch --merged   #显示所有已合并到当前分支的分支

 

git branch --no-merged   #显示所有未合并到当前分支的分支

 

git branch -m master master_copy  #本地分支改名

 

git checkout -b master_copy   #从当前分支创建新分支master_copy并检出

 

git checkout -b master master_copy  #上面的完整版

 

git checkout features/performance    #检出已存在的features/performance分支

 

git checkout --track hotfixes/BJVEP933     #检出远程分支hotfixes/BJVEP933并创建本地跟踪分支

 

git checkout v2.0   #检出版本v2.0

 

git checkout -b devel origin/develop  #从远程分支develop创建新本地分支devel并检出

 

git checkout -- README  #检出head版本的README文件(可用于修改错误回退)

 

git merge origin/master  #合并远程master分支至当前分支

 

git cherry-pick ff44785404a8e  #合并提交ff44785404a8e的修改

 

git push origin master  #将当前分支push到远程master分支

 

git push origin :hotfixes/BJVEP933   #删除远程仓库的hotfixes/BJVEP933分支

 

git push --tags  #把所有tag推送到远程仓库

 

git fetch  #获取所有远程分支(不更新本地分支,另需merge

 

git fetch --prune  #获取所有原创分支并清除服务器上已删掉的分支

 

git pull origin master  #获取远程分支mastermerge到当前分支

 

git mv README README2  #重命名文件READMEREADME2

 

git reset --hard HEAD  #将当前版本重置为HEAD(通常用于merge失败回退)

 

git rebase

 

git branch -d hotfixes/BJVEP933   #删除分支hotfixes/BJVEP933(本分支修改已合并到其他分支)

 

git branch -D hotfixes/BJVEP933  #强制删除分支hotfixes/BJVEP933

 

git ls-files  #列出git index包含的文件

 

git show-branch   #图示当前分支历史

 

git show-branch --all   #图示所有分支历史

 

git whatchanged   #显示提交历史对应的文件修改

 

git revert dfb02e6e4f2f7b573337763e5c0013802e392818      

 

#撤销提交dfb02e6e4f2f7b573337763e5c0013802e392818

 

git ls-tree HEAD   #内部命令:显示某个git对象

 

git rev-parse v2.0  #内部命令:显示某个ref对于的SHA1 HASH

 

git reflog  #显示所有提交,包括孤立节点

 

git show HEAD@{5}

 

git show master@{yesterday}   #显示master分支昨天的状态

 

git log --pretty=format:'%h %s' --graph   #图示提交日志

 

git show HEAD~3

 

git show -s --pretty=raw 2be7fcb476

 

git stash   #暂存当前修改,将所有至为HEAD状态

 

git stash list   #查看所有暂存

 

git stash show -p stash@{0}  #参考第一次暂存

 

git stash apply stash@{0}   #应用第一次暂存

 

git grep "delete from"  #文件中搜索文本“delete from

 

git grep -e '#define' --and -e SORT_DIRENT

 

git gc

 

git fsck

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1、基础

 

  • git config --global user.name "Your Name" 设置你的仓库用户名(用于标识提交者)
  • git config --global user.email email@example.com  设置你的仓库邮箱(用于标识提交者)
  • git init 初始化一个git仓库
  • git add --all 添加所有更改的文件
  • git add filename1 当然可以指定添加filename1
  • git commit -m "commit message" 添加更改的信息,必须要有,不然报错,不建议不加。
  • git status 查看git当前状态
  • git diff filename1 查看filename1到底修改了哪些内容
  • git log 查看最近的提交日志
  • git log --pretty=oneline 单行显示提交日志
  • git reset --hard commitID 利用git log得到的commitID返回版本
  • git reset --hard HEAD^回到上一个版本
  • git reflog 查看命令的历史,可以找到git log看不到的commitID,因为git log只显示当前的提交日志,如果你提交了一次,退回版本后又后悔了,就能查看上次提交的commitID
  • git checkout -- filename1 利用版本库中的版本替换工作区中的文件。功能有2
    • 撤销文件修改,分两种情况:
      • 撤销工作区中的修改(没有使用git add命令添加到暂存区)
      • 撤销暂存区中的修改(添加到了暂存区又做了修改)
    • 找回删除的文件
      • 工作区中文件误删了,可以通过此命令从版本库中找回
  • git reset HEAD filename1 撤销add,回到工作区
  • git rm filename1 删除文件
  • git remote add origin https://github.com/pengloo53/learngit.git 将本地库关联到github远程库上
  • git push -u origin master 第一次推送的时候要加上-u参数,可以将本地库的master分支与远程库的master分支关联起来;下次提交就不需要加-u了。
  • git clone https://github.com/pengloo53/learngit.git 克隆远程库到本地

 

2、分支管理

 

  • git checkout -b dev创建dev分支并切换到dev。相当于git branch devgit checkout dev两条命令。
  • git branch查看当前分支
  • git merge dev合并指定分支到当前分支,如,你现在master分支,那么执行命令就将dev分支合并到了master分支上。
  • git branch -d dev删除dev分支
  • git log --graph --pretty=oneline --abbrev-commit查看分支合并图
  • git merge --no-ff -m "merge with no-ff" dev禁用「Fast forward」,也就是保留分支的相关信息。
  • git stash 将工作区现场储藏起来,等以后恢复后继续工作。通常用于处理更为着急的任务时,例如:bug
  • git stash list 查看保存的工作现场
  • git stash apply恢复工作现场
  • git stash drop 删除stash内容
  • git stash pop 恢复的同时直接删除stash内容
  • git stash apply stash@{0} 恢复指定的工作现场,当你保存了不只一份工作现场时。
  • git branch -D feature-vulcan 强行删除分支。用于不需要合并,就地删除的情况。
  • git remote 查看远程库的信息,一般返回origin
  • git remote -v 查看远程库的详细信息。
  • git push origin master 将本地master分支推送到远程master分支。
    • master分支为主分支,因此要时刻与远程同步;
    • dev分支为开发分支,团队成员都需要在上面工作,所以也需要与远程同步;
    • bug分支只用于在本地修复bug,没有必要推送到远程;
    • feature新功能分支是否推送到远程,取决于你是否和其他人合作在上面开发。
  • git clone https://github.com/pengloo53/learngit.git 将远程库克隆到本地,默认只能看到master分支。
  • git checkout -b dev origin/dev 创建远程dev分支到本地
  • git pull 将远程分支的最新内容抓取下来。
  • git branch --set-upstream dev origin/dev将本地dev分支与远程dev分支之间建立链接。

 

多人协作工作模式

 

  1. 首先,可以试图用git push origin branch-name推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并(如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

 

3、标签管理

 

  • git tag v1.0 给当前分支打上标签
  • git tag 查看所有的标签,按时间顺序列出。
  • git log --pretty=oneline --abbrev-commit缩略commitID并单行显示提交信息
  • git tag v0.9 commitID通过上一条命令查看commitID,然后打上标签。用于忘记打标签的情况,因为标签其实就是只想某个commitID的指针,默认情况下,标签打在最新的提交上。
  • git show v0.9 查看标签信息。
  • git tag -a v0.1 -m "version 0.1 released" commitID创建带有说明的标签,-a指定标签名,-m指定说明文字。
  • git tag -d v0.1 删除标签v0.1
  • git push origin v1.0 推送标签1.0到远程
  • git push origin --tags 推送所有的标签到远程
  • git push origin :refs/tags/v0.9 删除远程标签,但是前提是要先在本地删除对应标签。

 

4、自定义Git

 

  • git config --global color.ui true Git显示颜色
  • .gitignore在这个文件里编辑你要忽略的文件,并提交到Git中,就可以忽略特殊文件的检查。如将*.db写入.gitignore文件中,将忽略所有db文件。可以参考github收集的所有.gitignore
  • git config --global alias.st statusstatus的别名设置成st,那么git st=git status
  • git config --global alias.unstage 'reset HEAD' 那么git reset HEAD filename=git unstage filename
  • git config --global alias.last 'log -1' git last就显示最后一次提交了。

 

5、搭建Git服务器

 

  1. sudo apt-get install git 安装Git
  2. sudo adduser git 添加Git用户;
  3. sudo git init --bare sample.git 初始化git仓库;
  4. sudo chown -R git:git sample.git修改仓库的所属用户为git
  5. git用户的信息git:x:1001:1001:,,,:/home/git:/bin/bash改成git:x:1001:1001:,,,:/home/git:/bin/git-shell,为了禁用shell登录。
  6. git clone git@server:/director/sample.git 克隆Git服务器上的仓库

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Git常用操作命令收集

    ### Git常用操作命令详解 #### 一、远程仓库管理(Remote Management) 在使用Git进行版本控制时,远程仓库是项目协作的重要组成部分。以下是一些常用的远程仓库管理命令: 1. **克隆远程仓库 (Clone Remote ...

    日常收集整理的Git常用命令

    以下是一些Git的常用命令,这些命令可以帮助你更有效地管理你的项目。 首先,了解Git的基本操作至关重要。`git help &lt;command&gt;` 可以显示特定命令的详细帮助,帮助你学习和理解各种命令的用法。例如,`git show` ...

    git常用操作-一目了然(原创90%+收集整理10%)

    本文将详细阐述Git的一些常用操作,包括工作区和状态的理解、代码的提交与同步、分支管理、暂存、回退以及冲突解决。 1. Git 工作区和状态: Git 的工作流程通常涉及到四个区域:工作区、暂存区、本地仓库和远程...

    Git基本命令

    ### 常用Git命令 - `git clone`:克隆远程仓库到本地。 - `git status`:查看当前工作区的状态。 - `git diff`:比较工作目录与暂存区的差异。 - `git checkout`:切换分支或恢复文件到某一状态。 - `git branch`:...

    Gerrit日常操作命令收集

    "Gerrit日常操作命令收集" 本文档收集了Gerrit日常操作中常用的命令,包括创建和销毁分支、合并和冲突解决、管理多个分支等。这些命令对于Gerrit的日常操作非常重要,可以帮助用户更好地管理代码仓库。 一、创建和...

    Git-1.9.4中文版

    了解和熟练使用Git对于现代软件开发至关重要,包括基本概念如仓库(repository)、工作区(working directory)、暂存区(staging area)和提交(commit),以及常用命令如`git clone`(克隆仓库)、`git add`(将...

    git 配置收集

    本文将深入探讨Git的配置,包括用户信息设置、全局与局部配置、别名设置、SSH密钥配置以及一些常用的高级配置。 首先,我们来了解如何设置Git的基本用户信息。当你克隆或创建一个新的Git仓库时,Git会默认使用你...

    db2 xml best practise

    - **收集XML数据统计信息**:定期收集统计数据,了解数据库的运行状态和性能。 - **监控XML工作负载**:实时监控数据库的工作负载,确保系统的稳定性和响应时间。 ### 开发纯XML应用程序 - **使用参数标记**:在短...

    Git和Repo的使用

    #### 三、Git常用命令 - **初始化仓库**: - `git init`:在当前目录下创建一个新的Git仓库。 - `git init --bare`:创建一个裸仓库(没有工作目录)。 - `git clone [url]`:克隆一个现有的仓库。 - **获取和推...

    Git权威指南.pdf

    2. **基本命令**:详细介绍如`git clone`用于克隆仓库、`git add`用于添加文件到暂存区、`git commit`用于提交更改等常用命令。 3. **分支管理**:解释如何创建、合并和删除分支,以及如何解决冲突。 4. **远程仓库...

    unix常用命令简单说明

    ### Unix常用命令详解 #### 一、基础命令 1. **cd**:改变当前工作目录。用户可以通过输入“cd 目录名”来切换到指定的目录。 2. **ls**:列出目录内容。用于查看当前目录下的所有文件和子目录。 3. **pwd**:...

    awesome-git-cn:收集整理一些常用的Git教程,工具变为资源库,盔甲在工作中Swift的查找所需。

    此外,学习并掌握常用的Git命令,如`git clone`用于克隆远程仓库,`git add`用于暂存更改,`git commit`用于提交更改,`git push`用于将本地更改推送到远程仓库,以及`git pull`用于获取并合并远程仓库的最新更改,...

    git-aliases:一个漂亮的git-alias备忘单。 包括印刷版

    在`git-aliases`项目中,作者收集了大量常用且实用的Git命令别名,涵盖了从分支管理到提交历史查询的各种操作。这些别名可以极大地提高开发效率,特别是对于频繁使用Git的开发者来说。 例如,`st`可以作为`status`...

    备忘单:收集git,vim,快捷方式,Linux命令等备忘单

    常用命令包括: - `git init`:初始化一个新的Git仓库。 - `git clone`:克隆远程仓库到本地。 - `git add`:将文件添加到暂存区。 - `git commit`:提交暂存区的更改到本地仓库。 - `git push`:将本地仓库的...

    Notre_Git:一个仓库来保存有关git的信息

    2. **Git常用命令**: - **初始化仓库**:`git init` - **克隆仓库**:`git clone &lt;url&gt;` - **添加文件到暂存区**:`git add &lt;file&gt;` 或 `git add .` - **提交**:`git commit -m "commit message"` - **查看...

    NoteBook:前端学习笔记

    前端记录 JavaScript Moment JS开发技巧篇 ① String(字符串)篇 ② Number(数值)篇 ③ Boolean(布尔)篇 ④ Array(数组)篇 ...Git常用命令 Git常见报错 Tools IDCard(根据身份证获取基本信息) Time(转换对象mom

    ansible教程

    Ansible可以通过多种方式安装,包括下载源码编译安装、从Git获取资源安装或通过rpm包安装。对于rpm包安装,还需要配置EPEL(Extra Packages for Enterprise Linux)源。安装后,接下来是配置Ansible,包括环境配置、...

    web漏洞挖掘经验.pdf

    Web 漏洞挖掘需要对目标进行全面信息收集,包括域名信息、子域名信息、敏感信息、敏感文件、敏感目录、Email 收集、IP 段信息收集、常用端口信息收集等,然后使用相应的工具和技术进行渗透和攻击。

    linux-日报周报月报生成脚本

    在IT行业中,自动化任务...通过shell脚本技术,它能够收集和整理git提交历史,生成直观的文本报告,方便团队成员了解项目进度和每个人的工作贡献。对于任何经常需要编写工作汇报的开发者来说,这是一个非常实用的工具。

Global site tag (gtag.js) - Google Analytics