git 命令总结

by admin on 2020年5月3日

Git 2.7.0 RC2 发布, 2.7 主要更新如下:

请以解决问题为核心,不要为了用技术而用技术。

1. 配置

UI, Workflows & Features

公司各个项目有CVS、SVN、HG、Git等多版本管理工具。

 

 * The appearance of “gitk”, particularly on high DPI monitors, have
   been improved.  “gitk” also comes with an undated translation for
   Swedish and Japanese.

但CVS确实太老了,十分不便,由于历史原因公司的部分旧代码还都是用CVS来管理,恰恰是我目前在用的-
-|||。但是我们可以在本地使用Git来方便代码的管理。因为Git作为分布式版本管理系统,本身local端就是完备的。

git config –global user.name “your name”

 * “git remote” learned “get-url” subcommand to show the URL for a
   given remote name used for fetching and pushing.

如果是用SVN、HG等版本控制系统,有git-svn等解决方案可以不改变服务端而非常方便的在本地用git,但CVS并没有找到现成的方法…,可能确实太老了吧!

git config –global user.email  mail@box.com

 * There was no way to defeat a configured rebase.autostash variable
   from the command line, as “git rebase –no-autostash” was missing.

最近终于想到了个方法,利用合理的流程+Git钩子,来实现Git对CVS的操作:

git config –global color.ui true

 * “git log –date=local” used to only show the normal (default)
   format in the local timezone.  The command learned to take ‘local’
   as an instruction to use the local timezone with other formats,

 git push 时执行python脚本解析本次commit的文件,分别执行cvs update
<filename>推送到服务器。

git config –global core.editor vi

 * The refs used during a “git bisect” session is now per-worktree so
   that independent bisect sessions can be done in different worktrees
   created with “git worktree add”.

Git 钩子:自定义你的工作流

Git钩子是在 Git 仓库中特定事件发生时自动运行的脚本。它可以让你自定义 Git
内部的行为,在开发周期中的关键点触发自定义的行为,因为脚本可以完全定制,你可以用
Git 钩子来自动化或者优化你开发工作流中任意部分。

git钩子介绍及使用方法:

How To Use Git Hooks To Automate Development and Deployment
Tasks: 

Hooks汇总:

Hook Name

Invoked By

Description

Parameters (Number and Description)

applypatch-msg

git am

Can edit the commit message file and is often used to verify or actively
format a patch’s message to a project’s standards. A non-zero exit
status aborts the commit.

(1) name of the file containing the proposed commit message

pre-applypatch

git am

This is actually called after the patch is applied, but before the
changes are committed. Exiting with a non-zero status will leave the
changes in an uncommitted state. Can be used to check the state of the
tree before actually committing the changes.

(none)

post-applypatch

git am

This hook is run after the patch is applied and committed. Because of
this, it cannot abort the process, and is mainly used for creating
notifications.

(none)

pre-commit

git commit

This hook is called before obtaining the proposed commit message.
Exiting with anything other than zero will abort the commit. It is used
to check the commit itself (rather than the message).

(none)

prepare-commit-msg

git commit

Called after receiving the default commit message, just prior to firing
up the commit message editor. A non-zero exit aborts the commit. This is
used to edit the message in a way that cannot be suppressed.

(1 to 3) Name of the file with the commit message, the source of the
commit message (messagetemplatemergesquash, or commit),
and the commit SHA-1 (when operating on an existing commit).

commit-msg

git commit

Can be used to adjust the message after it has been edited in order to
ensure conformity to a standard or to reject based on any criteria. It
can abort the commit if it exits with a non-zero value.

(1) The file that holds the proposed message.

post-commit

git commit

Called after the actual commit is made. Because of this, it cannot
disrupt the commit. It is mainly used to allow notifications.

(none)

pre-rebase

git rebase

Called when rebasing a branch. Mainly used to halt the rebase if it is
not desirable.

(1 or 2) The upstream from where it was forked, the branch being rebased
(not set when rebasing current)

post-checkout

git checkoutand git clone

Run when a checkout is called after updating the worktree or
after git clone. It is mainly used to verify conditions, display
differences, and configure the environment if necessary.

(3) Ref of the previous HEAD, ref of the new HEAD, flag indicating
whether it was a branch checkout (1) or a file checkout (0)

post-merge

git merge or git pull

Called after a merge. Because of this, it cannot abort a merge. Can be
used to save or apply permissions or other kinds of data that git does
not handle.

(1) Flag indicating whether the merge was a squash.

pre-push

git push

Called prior to a push to a remote. In addition to the parameters,
additional information, separated by a space is passed in through stdin
in the form of “<local ref> <local sha1> <remote ref>
<remote sha1>”. Parsing the input can get you additional
information that you can use to check. For instance, if the local sha1
is 40 zeros long, the push is a delete and if the remote sha1 is 40
zeros, it is a new branch. This can be used to do many comparisons of
the pushed ref to what is currently there. A non-zero exit status aborts
the push.

(2) Name of the destination remote, location of the destination remote

pre-receive

git-receive-pack on the remote repo

This is called on the remote repo just before updating the pushed refs.
A non-zero status will abort the process. Although it receives no
parameters, it is passed a string through stdin in the form of
“<old-value> <new-value> <ref-name>” for each ref.

(none)

update

git-receive-pack on the remote repo

This is run on the remote repo once for each ref being pushed instead of
once for each push. A non-zero status will abort the process. This can
be used to make sure all commits are only fast-forward, for instance.

(3) The name of the ref being updated, the old object name, the new
object name

post-receive

git-receive-pack on the remote repo

This is run on the remote when pushing after the all refs have been
updated. It does not take parameters, but receives info through stdin in
the form of “<old-value> <new-value> <ref-name>”.
Because it is called after the updates, it cannot abort the process.

(none)

post-update

git-receive-pack on the remote repo

This is run only once after all of the refs have been pushed. It is
similar to the post-receive hook in that regard, but does not receive
the old or new values. It is used mostly to implement notifications for
the pushed refs.

(?) A parameter for each of the pushed refs containing its name

pre-auto-gc

git gc --auto

Is used to do some checks before automatically cleaning repos.

(none)

post-rewrite

git commit --amendgit-rebase

This is called when git commands are rewriting already committed data.
In addition to the parameters, it receives strings in stdin in the form
of “<old-sha1> <new-sha1>”.

(1) Name of the command that invoked it (amend or rebase)

git config –global alias.lol “log –graph –all”   
设置alias,这样lol就是自己新的命令了。

 * Users who are too busy to type three extra keystrokes to ask for
   “git stash show -p” can now set stash.showPatch configuration
   variable to true to always see the actual patch, not just the list
   of paths affected with feel for the extent of damage via diffstat.

Workflow for Remote CVS, Local Git

 图片 1

所有命令在Git Bash中执行,和正常的git流程相比:

1、git pull 被 cvs update 替换,且最好只在master上进行。

2、每次update后需要git commit -a “syn cvs date+msg”
执行一次commit,把本次cvs更新的内容加入git版本库。

 其他完全一样,随意切换分支!记得git stash save !

 

其他注意项:

1、在本地CVS代码处初始化git库

2、填写.gitignore规则,先commit,在 git bash 中 cvs update
后整体commit作为初始版本。

3、git master分支和远端cvs
master分支对应,此后master分支只处理合入,dev分支最为常用开发。

4、设置一个有效的git remote url,才能执行git push利用Hook:
pre-push,使用sys.exit(1)放弃本次git push。

 

 

完整的更新内容请看:2.7.0.txt

2.基本使用

下载页面:
v2.7.0-rc2

1.显示当前的配置信息

Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。

git config –list

开源中国 Git
代码托管平台

 

图片 2

  1. 创建repo

(文/)    

从别的地方获取

git clone git://git.kernel.org/pub/scm/git/git.git

 

 

自己建立

mkdir test

cd test

git init

 

  1. 显示状态

git status

 

  1. commit

git add file.1 file.2
先增加文件,增加到index中。这样commit的时候才知道要commit哪些文件。

或者

git add -p   用来interactively选择哪些改变需要被commit

git commit -m “log message”

 

或者

git commit -a 
自动检查应该commit什么文件。如果是新增的文件,仍然要使用git add来添加。

 

  1. 显示以前的工作

git log 输出格式

git log

git log -p       显示patch

git log –stat   显示改动的一个总结

git log –graph  只显示当前branch的

git log –graph –all    显示所有branch的

git log –graph –all –decorate 显示branch的名字

 

git log –pretty=oneline, short, full, fuller  输出的log 形式不同

git log –pretty=format:”%h – %an, %ar : %s”   按照指定的格式输出。

关于–pretty的其他选项和具体的format格式,参考 git log –help中PRETTY
FORMAT这部分。

 

git log –follow file.c

这个功能很有意思,尤其是当file.c被移动后。

通常我们会移动某个文件到某个目录下。如果这么做,git
log是不能显示目录移动前的记录的。

那就加上 –follow吧。

 

git log的筛选

git log -2 -p   显示最近两次commit的log 和 diff

git log –author=”Author Name” 筛选特定作者的log

git log –since=”2012-2-23″ –before=”2012-2-24″ 筛选时间段

git log –grep=”key word” 在commit 的message中查找关键字

git log branch –not master 查看在branch上的,但不在master上的记录。 

 

git log -S”func_name”  查找某个字符出现,或者移出的commit。
比如可以查找一个函数是什么时候添加,或者删除的。

 

git show sha1  
这个sha1是每个commit的sha1,这样显示某个commit的完全信息,包括diff

 

  1. 撤销改动

git checkout — file.1

撤销了file.1的这次改动。只是撤销了没有staged的改动.

中间的 — 表明了这是一个文件 而不是一个branch的名字

 

git reset –hard HEAD

撤销了所有没有commit的改动,包括了stage的和没有stage的。

这条命令的结果一样

git checkout HEAD file.1

包括了staged 和没有staged的都会清除。

 

有时候我们发现,之前做个一个commit有问题,不想要,想要去掉。

git revert HEAD     
自动得重新做一个commit,将最后一次的commit返回回来。

git revert HEAD^     自动得重新做一个commit,将最后第二次的commit
返回回来。

 

  1. 删除一个commit

git reset –hard HEAD~1

删除了最近的commit

 

  1. 修改最近的一个commit

git commit –amend

 

7.显示所做的改动

git diff

显示所有的改动。 没有add到index中的。

 

git diff –staged或者 git diff –cached

显示staged改动,也就是add的东东,也就是将要commit的东东。

 

git diff commit1 commit2

显示这两个commit之间的变动, 从commit1到commit2的变动。

 

git diff commit1..commit2

两个点,效果跟上面的一样

 

git diff commit1…commit2

三个点,表示的是发生在commit2分支,一直到commit1和commit2共同父亲的变化。

 

git blame -C file1.c

显示文件具体的改动。。。。恩,好像是用来找是谁的错?

 

git blame -Ln,m file1.c 

查看n,m两行间的改动。

 

git blame commit1~1 -Ln,m file1.c

查看commit1版本前的改动. 追查之前的log。

 

git blame commit1~1 -Ln,m — old/file.c

如果这个文件被重命名过,或者移动过位置,就要输入旧的文件的名字。

而且一定要加上 — , 一定。

 

  1. 删除某个文件

git rm file-name

从库和当前的working directory中删掉这个文件

git rm –cached file-name

只从库中删除,保留当前的本地文件。

 

  1. 重命名一个文件

git mv file file-new

 

  1. 应用patch

git apply patch-file

这样做从patch-file中应用这个patch。 效果和patch命令类似。 

但是好处是,git
apply要么成功,要么不成功。不想patch,有可能有部分的patch打上了,但是有的没有打上。

git apply后,并没有自动生成一个commit. 

 

git apply –check  可以用来检测这个patch 是不是会产生冲突或者失败。

 

git am patch-file

这是专门为git 设计的命令。 patch-file是通过git format-patch 生成的。 

其中包含了作者信息和简单描述。

git am后,会自动的生成一个commit.

 

git am –resolved

git am 过程中可能会有conflict. 如过遇到conflict, 那就需要手动修改code,
git add 后

用git am –resolved 

 

  1. git 制作patch

具体步骤写在了 

 

3. commit range

在git中,我们经常需要制定一个commit的范围,比如git
log中,可以显示某范围内的改动。

除了man gitrevisions, 在这个网站上也有不过的描述,尤其是对 double dot 和
triple dot

而且这种语法,在git log和git diff两种情况下,有不同的意义.

 更多git文章:

在git log中, 

git log ^r1 r2
表示显示从r2到root,但是去掉r1到root中和r2到root有重复的。

这个也可以表示为 git log r1..r2. 

 

git log r1…r2 表示 显示从r1到root, r2到root,但是去掉他们共有的部分。

 

我这样理解, 前一种显示的是树上的一个分支。而后一种显示了两个分支。

 

在git diff中

git diff目的是比较两个commit之间的区别。

 

git diff A B 和 git diff A..B 是一样的,就是显示这两个之间的区别。

 

git diff A…B 和 git diff $(git-merge-base A B) B一样。 就是显示
在B这个分支上,做了什么改动。

                      有时候这个命令是,git merge-base A B

 

在一个branch上,但不在另一个branch上

git log local_copy ^kernel 

这样可以再merge前,看看都有哪些东西要commit.

这个命令用来看,在local_copy branch上,但是不在kernel branch上的。 

 

 

 

 

4. Branch

  1. 显示branch

git branch

git branch -v 显示详细点的信息

git branch –merged

 

  1. 创建branch

git branch testing

或者

git checkout -b new_brach

这样新建并且切换到了new_brach上

 

还有一种创建branch的办法是

git branch branch_name  b42294309188d57bf3398ed35660170a237d8c0a

注意,这后面这一长串的就是每个commit的sha1码。

 

  1. 切换到某个branch

git checkout testing

 

  1. 图形化显示branch信息

gitk

gitk –all

 

  1. merge

先转到要merge到的branch,如

git checkout master

一般都会merge到master上。

 

然后调用

git merge testing

这样就把testing branch上的改动merge过来了。

 

  1. 删除branch

好了,这个branch不用了,删掉吧

git branch -d testing

 

  1. 处理conflict

在merge的过程中一般会遇到conflict.

先用git status查看哪些文件产生的冲突。

可以逐一修改文件,也可以用git mergetool 来进行修改。

当所有的都修改好, 使用git commit。

 

8。 查看有哪些branch merge进来了,哪些没有

git branch –merged

git branch –no-merged

比如说我们checkout 到 master,用–no-merged
可以看到还有哪个branch的改动没有到master上。

 

  1. Stash

git stash 用来备份当前工作区的内容。
从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。

可以多次使用git stash来保存当前的修改。

 

git list可以看到一共保存了多少次。

linux-2.6$ git stash list
stash@{0}: WIP on 3.0: 02f8c6a Linux 3.0
stash@{1}: WIP on pci-fix: 79eefa4 Optimize the resource overlap check
stash@{2}: WIP on pci-fix: 02f8c6a Linux 3.0
stash@{3}: WIP on 3.0: 02f8c6a Linux 3.0

git stash save “name”

git stash

这两个都是保存当前的改动, 如果有name则可以添加一个方便辨识的标签。

 

git stash apply 用来恢复最近一次的修改。

git stash apply stash@{1}来恢复指定的修改。

 

git stash pop stash@{1} 的作用和git stash apply类似。 

git stash pop 会从stash栈中移除某个记录,而git stash apply不会。

 

git stash clear 清空栈。

 

6. Tag

  1. 显示tag

git tag    显示所有的tag

 

匹配显示

$ git tag -l v3.0*
v3.0
v3.0-rc1
v3.0-rc2
v3.0-rc3
v3.0-rc4
v3.0-rc5
v3.0-rc6
v3.0-rc7

  1. 显示某个tag的详细信息

git show v3.0

 

  1. 创建tag 

git tag -a v1.4 -m “my version 1.4”

 

git tag -s v1.5 -m “my version 1.5”

这个将会加上pgp的签名

 

对于一个-s的tag, 你可以

git tag -v v1.5

来验证这个tag, 当然你需要有对方的PGP公钥。

 

git tag v1.4-lw

这个是轻量级的tag。

 

git tag -a v1.2 SHA

对某个指定的SHA打tag,默认是HEAD

 

git push origin v1.2

git push origin –tags

默认情况下是不会将tag的信息送到远端的。 

第一的命令将某个指定的tag送到远端。

第二个命令将所有的tag送到远端。

 

7. Remote Repository

这个网上可以提供建立一个免费的git的repo

remote repo是用来多个人合作的。恩。。。,比较高级。

 

显示remote repo的信息

git remote

git remote -v

git remote show origin 

 

添加别的remote 库

git remote add localname URL

也就是用这个localname 来代表URL

 

然后就可以从remote中下载代码

git fetch localname

 

默认glone后local的HEAD是track在origin/master上的,

所以如果你想要work on别的branch,需要先在本地建立一个branch

git branch –track feature origin/feature

这个意思是本地有个叫feature的branch,这个是track origin/feature的。

 

查看remote的情况

git remote show origin

 

上传changes,如果你有权限,你可以上传自己的更新到remote

git push origin master

意思是push到 origin这个远端树的master 分支上

git push origin :master

是删除remote的分支

 

下载别的更新?

git pull

下载了更新就直接merge了

 

当本地的git仓库更新后,我们需要与远端server上的仓库同步。

一般这么做

git fetch   将同步一下状态

git fetch -p 可以清空远端已经不用的分支

git branch -v 可以看到本地仓库中分支的状态。

git branch -av 可以看到远端和本地分支的状态

git checkout branchname 换到你想要更新的local branch上

git rebase origin/branchname 这样可以将本地做的commit
取下,并重新apply到最新的地方。

 

8. Some Tips

1.
假如编辑到了某个版本,发现某个功能不起作用了,或者有bug了。但是自己知道之前的某个版本是好的。

git bisect start

git bisect bad      现在这个版本是坏的

git bisect good good_commit   good_commit这个版本是好的

 

接下来编译,测试。 如果是好的

git bisect good

如果还是不好

git bisect bad

这样git都会给你输出某个中间的版本让你继续测试。

 

找到了错误,用

git bisect reset 恢复到原先的版本。

 

  1. git 命令在bash中自动补全

 

将git-completion.bash 拷贝到 /etc/bash_completion.d/git

 

  1. gitalias

git config –global alias.co checkout

 

  1. 用git 打包

git archive master | gzip  > master.tar.gz

把master这个branch打包了。 

 

  1. cleanup

git用得时间多了,会变慢。 那么可以用下面的命令优化一下。

git gc   – Cleanup unnecessary files and optimize the local repository

git-repack – Pack unpacked objects in a repository

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图