git使用指南

简介: ### 下载代码库 ```shell git clone git@gitlab.alibaba-inc.com:snsgalxy-dev/snsgalaxy.git ``` ### 创建分支 ```shell git checkout -b -t ``` 以上命令用于创建名字为``的分支, 然后切换到这个分支, 同时让这个分支`track`远程代码库中的``分支。适用于创建一个

下载代码库

git clone git@gitlab.alibaba-inc.com:snsgalxy-dev/snsgalaxy.git

创建分支

git checkout -b <new_branch> -t <remote_branch>

以上命令用于创建名字为<new_branch>的分支, 然后切换到这个分支, 同时让这个分支track远程代码库中的<remote_branch>分支。适用于创建一个用于指向远程代码库中已经存在的分支的情况。执行这个命令之后, 我们就可以使用git pull或者git push来拉取变更或者推送变更了。如果不带-t参数, 则需要使用git push <remote_branch> <local_branch>或者git pull <remote_branch>命令。

如果是新创建一个分支, 想要在远程代码库中也创建同样的分支, 同时让本地分追踪向远程分支, 则需要执行下面的命令:

git branch <new_branch> #创建本地分支
git push <remote_repo> <new_branch> #将本地分支拷贝到远程代码库
git branch -t <new_branch> <remote_branch> #让本地分支追踪远程分支

比如, 我们在本地创建了一个test分支, 远程代码库是origin, 带入上面的命令模板就得到了下面的命令:

git branch test
git push origin test
git branch -t test origin/test

查看提交日志

使用git log命令可以查看一个或者多个分支的提交日志, 详细使用参见git reference

git log --name-status

上面的命令可以获得类似于svn log的输出信息, 可以告诉我们那些文件被如何修改了。

git log --status

可以输出更加详细一些的信息, 包括了做了多少修改。

git log --name-only

只输出被变更的文件的名字, 不给出如何被修改。

git log --pretty=format:"<format_string>" --date=local

上面的命令可以控制git log输出的格式, 随心所欲, 同时将日期设定为本地时间。可用的格式控制符号以及日期输出控制参数参考git help log, 这里给出几个比较有用的参数,

git log --pretty=format:"%h %H %au %ad %s" --date=local

%H:打印完整的commit哈希值;
%h:打印短格式的commit哈希值, 但是足够用来区分不同的提交;
%au:打印提交人;
%ad:打印提交日期;
%s:打印提交时输入的提交信息;

查看变更

使用git diff命令可以比较版本库中的文件, 详细使用参见git reference

分支合并

git中有两条命令可以用来完成合并, 分别是git rebasegit merge, 两者的区别和使用方式参见git community book中文版

如果合并时发生冲突, 请看这里:如果解决合并冲突并提交

使用merge命令的--stat参数可以在合并完成之后显示diff信息。

撤销变更

由于git本身的设计和文件结构, 在git中有多种撤销变更的方式, 参考git community book中文版

git reset --hard

上面的命令会将本地分支回滚到上一次提交的状态, 同时将变更应用到工作目录中。

git reset <commit> --hard

上面的命令会将本地分支回滚到指定的<commit>, 同时将变更应用到工作目录中。

如果想回滚远程代码库中的分支到某个特定的<commit>, 可以使用下面的命令,

git checkout <local_branch_which_track_remote>
git reset --hard <commit>
git push -f

首先切换到要回滚的分支, 然后在本地执行回滚, 之后在推送到远程代码库的时候需要加上-f参数。默认情况下git只允许向前推送commit, 也就是说, 远程代码库中的HEAD必须要落后与本地分支的HEAD, 而在推送回滚的时候, 远程代码库的HEAD是会超前于本地代码库的HEAD(因为本地回滚到了更早的分支), 这时就要加上-f参数让git跳过这个检查。当然了, 如果你回滚的commit仍然是要比远程代码库的HEAD超前, 那么就不用加-f参数了。

使用git reset这种方式来回滚是会丢失提交的, 一般情况下应该尽量不要在远程代码库执行reset, 特别是有其他人已经使用了你之前提交到远程库的代码的时候(如果下次有人提交远程库, 会把之前的代码又放上去的)。优先应该考虑使用git revert来进行回滚, 这个命令的是通过创建commit来执行回滚的, 因此前面不会丢失提交。

获取更新

通过git fetchgit pull命令可以获取其他开发人员提交的更新。

git fetch命令从远程代码库拉取整个库的更新, 但是不会应用到本地代码库中。而git pull则是在执行了git fetch命令之后, 还会执行一次git merge命令, 将更新应用到本地代码库中。

如果当前分支配置了追踪远程代码库的分支, 那么运行git pull命令之后则会将远端分支的变更应用到当前分支上。如果没有配置追踪远程分支, 那么就需要手动执行git merge命令来应用更新。

提交更新

首先, 需要使用git add命令将发生变更的文件添加到本地的索引文件(也被叫做暂存区或者stage)中, 然后执行git commit命令将变更提交到本地代码库。执行git commit命令之后, 会在本地代码库中创建一条提交记录, 保存了这次提交发生的所有变化。

一般我们会执行下面的命令来添加变更到本地的索引文件中,

git add .

如果对提交的内容不放心, 则可以使用-n参数, 如下,

git add . -n

添加-n参数之后, git会试运行一次add命令, 把发生变更的文件打印出来, 这样我们就能清楚地看到我们修改了哪些文件, 这就是dry run。git的很多其他命令也都有类似的功能。

执行完git add命令之后, 我们需要将变更提交到本地代码库, 命令如下,

git commit .

通过git push命令可以将本地更新提交到远端代码库, 如果本地分支配置了追踪远程分支, 则执行git push命令就可以了, 否则在执行git push命令的时候需要加上远程代码库以及本地分支两个参数, 类似于git push <remote_repo> <local_branch>

如果本地配置了多个追踪远端分支, 那么在执行git push的时候, git会检查每个分支是否可以push。只有当前的分支才会被真正push到远程代码库, 其他的分支仅仅是做了一次检查, git会将检查结果现实到标准输出上。

清理当前目录

当我们在工作目录上工作了一段时间之后, 或多或少会产生一些我们不想提交的文件, 比如单元测试的时候生成的日志文件等等, 在提交之前我们可以用git clean命令来清理掉这些我们不想提交的文件或者目录。

当然, 作为一个谨慎的程序员, 在真正清理之前还是希望能够了解一下被清理的内容的, 执行如下命令,

git clean -d -n <path>

上面的命令会执行一次dry run, 把将会被清理掉的所有文件和目录都打印出来, 我们可以选择其中的一个或者多个或者全部, 来执行清理, 真正清理时只要去掉-n参数就可以了。比如你想清理当前目录, 那么执行下面的命令就可以了,

git clean -d <path>

git的clean命令还有其他一些有用的选项, 执行git help clean可以对这些选项进行了解。

使用patch

使用git format-patch命令可以创建邮件格式的patch, 通过git apply或者git am可以将这些patch应用到工作目录中。

每一个patch都包含了当前提交于其上一个提交之间的差别, 假设有A, B, C, D四次提交, A先被创建, 紧接着是B、C和D。如果我们在git format-patch命令中指定了创建patch用的提交范围是A到D, 执行如下命令之后会生成3个patch文件,

git format-patch --root A..D

假设这三个patch文件的名字分别是0001, 0002和0003, 那么0001包含提交B在提交A的基础上对代码做的修改, 0002包含提交C在提交B的基础上对代码做的修改, 而0003则包含提交D在提交C的基础上对代码做的修改。

这些patch文件已经被生成为邮件格式, 可以直接通过邮件程序进行发送, 如果你没有某个代码库的提交权限, 那么可以将生成的patch文件发送给拥有代码库提交权限的人, 让他为相应的代码打上patch。

在打patch的时候, 我们要弄清楚patch到底是根据哪个提交生成的, 否则会失败。例如, 如果我们想将上面生成的0001这个patch打到我们的代码库中, 必须要让代码库处在提交A的状态下, 否则基本上会是失败的。因为0001中生成的diff信息是通过比较B和A两个commit中相应文件的变化而生成的, 因此并不能保证能够成功运用到所有的提交状态下。

假设在提交B中, 我们在提交A的基础上对文件hello.c做了变更, 然后生成了一个patch。而在另外一个提交C中, hello.c文件也发生了变化, 这是如果我们想把0001这个patch打到提交C上, 是有很大可能行会失败的(就算不失败, 也有很大可能性会破坏文件)。因为在应用提交的时候, 是根据patch文件中的信息在hello.c这个文件中寻找要删除或者要添加的行, 由于在提交C中, hello.c这个文件也发生了变化, 因此0001这个patch中保存的相关差别信息相对于提交C中的hello.c文件来说就是不准确的信息。这个与我们使用linux的diffpatch命令时候的原理是一样的, 只不过git帮助我们寻找有差别的文件。

删除远程分支

git push <remote_repo_name> :<branch_name>

执行命令的时候可能会报类似下面的异常,

error: unable to delete 'tags/20150116_r_release_163047259-code': remote ref does not exist
error: failed to push some refs to 'git@gitlab.alibaba-inc.com:tsearcher/tsearcher-center-node.git'

这是因为tags/20150116_r_release_163047259-code这个分支在远程代码库中已经不存在了, 但是本地的代码库并没有清理掉相关的信息, 执行下面的命令清理一下本地的代码库,

git fetch -p origin

-p参数告诉git删除存在于本地, 但是在远程代码库中已经不存在了的那些分支。

创建代码库

mkdir git_repo
cd git_repo
git init
touch README
git add README
git commit -m 'first commit'
git remote add origin remote_git_repo_address ## 例如git@gitlab.alibaba-inc.com:tsearcher/tsearcher-center-node.git 
git push -u origin master

上传本地代码库到远程代码库

cd existing_git_repo
git remote add origin remote_git_repo_address ## 例如git@gitlab.alibaba-inc.com:tsearcher/tsearcher-center-node.git 
git push -u origin master

追踪远程分支-无本地分支

git checkout --track origin/develop

其中origin是远程代码库的别名, develop是远程分支的名字。上面这条命令会在本地创建一个develop分支, 同时追踪远程的develop。在执行git pushgit pull命令时, 目标都是远程的develop分支。

追踪远程分支-已存在本地分支

如果想让本地已经存在的分支追踪远程分支, 或者要修改本地分支追踪的远程分支, 执行下面的命令:

git branch --set-upstream-to=origin/<remote-branch> <local-branch>

其中origin是远程代码库的别名, remote-branch是远程代码库中的分支名, local-branch是本地代码库中的分支名。

上传本地分支到远程代码库

本地的一个分支, 如果想与他人共享, 需要先将分之上传到远程代码库, 这样其他的开发人员才能够下载这个分之, 下面的代码可以完成上传本地分之的操作。

$ git checkout -b feature_branch_name
... edit files, add and commit ...
$ git push -u origin feature_branch_name

创建tag

git有两种创建tag的方式, 一种是轻量级tag(lightweight tags), 一种是标注tag(annotated tags)。标注tag其实就是一个commit, 而轻量级tag则仅仅是某个commit的引用和别名。

下面的命令用来创建标注tag,第一条命令基于当前分支创建标注tag, 第二条命令基于指定的分支创建标注tag。-m参数用来添加注释, 如果没有-m参数, git会打开默认的文本编辑器:

git tag -a <tag name> -m 'commit message'

git tag -a <tag name> <branch name> -m 'commit message'

下面命令用来创建轻量级tag,第一条命令基于当前分支创建轻量级tag, 第二条命令基于指定分支创建轻量级tag:

git tag <tag name>

git tag <tag name> <branch name>

A lightweight tag is very much like a branch that doesn’t change – it’s just a pointer to a specific commit.

Annotated tags, however, are stored as full objects in the Git database. They’re checksummed; contain the tagger name, email, and date; have a tagging message; and can be signed and verified with GNU Privacy Guard (GPG). It’s generally recommended that you create annotated tags so you can have all this information; but if you want a temporary tag or for some reason don’t want to keep the other information, lightweight tags are available too.

使用下面的命令将本地创建的tag推送到远程git库:

git push --tags

删除tag

git tag -d <tag name>

git push origin :<tag name>

前一条命令删除本地库中的tag, 第二条命令删除远程库中的tag。origin是远程库的名称, 默认是origin, 但是可以修改。

在git库中查询包含某个文件的commit

git log --all -- file
git log --all -- '**/file'

查询包含某个commit的branch

git branch --contains <commit>
git branch -r --contains <commit>
git branch -a --contains <commit>

第一条命令列出包含的本地分支, 第二条命令列出包含的远程分支, 第三条命令列出包含的所有分支。

checkout tag并创建本地分支

git checkout tags/<tag_name> -b <branch_name>

拉取远程分支的最新commit并且rebase本地变更

git pull --rebase origin master

这种方式不会产生一个merge commit,有利于保持分支线性的分支历史记录

目录
相关文章
|
2月前
|
Shell Linux 开发工具
【Shell 命令集合 系统管理 】Linux 查看当前Git仓库的提交历史 gitps命令 使用指南
【Shell 命令集合 系统管理 】Linux 查看当前Git仓库的提交历史 gitps命令 使用指南
25 0
|
开发工具 git
Git的基本使用(上)
Git的基本使用
121 0
Git的基本使用(上)
|
Linux Shell 项目管理
Git使用前配置
本章节我们将详细了解与学习Git使用前配置
155 0
Git使用前配置
|
Shell 网络安全 开发工具
Git的一次使用流程
Git的一次使用流程
121 0
|
Linux 开发工具 git
14 Git 使用问题总结
问题分析 : could not lock config file %HOMEDRIVE%%HOMEPATH%/.gitconfig 的问题 在我的电脑上 HOME 的值是 %HOMEDRIVE%%HOMEPATH% 竟然不识别。已知 %homedrive% 指操作系统所在盘默认为C:,%HOMEPATH% 指的是用户所在目录,举例说明\Users\zhangsan。 所以手动改成 C:\Users\hp 即可。
333 0
14 Git 使用问题总结
|
Shell Linux 网络安全
Git 使用指南
Git是目前世界上最先进的分布式版本控制系统。在当前目录新建一个Git代码库,新建一个目录,将其初始化为Git代码库。
Git 使用指南
|
存储 前端开发 IDE
Git全栈开发者使用指南
Git全栈开发者使用指南
159 0
Git全栈开发者使用指南
|
存储 安全 Java
大牛总结的 Git 使用技巧,写得太好了!
前言 本文是参考廖雪峰老师的Git资料再加上我自己对Git的理解,记录我的Git学习历程,作下此文是为以后学习,工作,开发中如果遇到问题可以回过头来参考参考。因为水平有限,难免会有出错的地方,欢迎指正。
173 0
大牛总结的 Git 使用技巧,写得太好了!
|
存储 前端开发 IDE
Git全栈开发者使用指南
Git是一种分布式版本控制系统,由Linux之父Linus开发。本文详细介绍了Git的基本使用、常用命令整理、开发工具集成。
117 0
 Git全栈开发者使用指南
|
Java jenkins 测试技术