众所周知,Git目前已经是分布式版本控制领域的翘楚,围绕着Git形成了完整的生态圈。学习Git,首先当然是学习Git的基本工作流。相比于SVN等传统版本控制系统来说,Git是专为分布式版本控制而生的强大工具。使用Git时常用的命令有pull、commit、push等,貌似很简单。不过,有时你会遇到合并冲突的情况,Git这时会将冲突标记出来,需要你手工来解决。有时,你会不小心将代码提交到错误的分支上,并且又推送到了远程仓库。还有些时候,你需要切换到不同的分支,但Git却不让你这么做,因为还有未保存的修改。如果需要通过另一个分支的提交来为代码打补丁该怎么做呢?本文就将介绍12个Git高级命令,合理使用这些命令可以大大提升应用Git的效率。
1. 使用rebase而非merge来拉取上游修改
分支合并会被记录为一次合并提交,这种做法是很有意义的。比如说,可以通过这种方式来标识一个新特性被合并到了发布分支中。不过,当多个团队成员工作在一个项目中并使用常规的git pull来同步分支时,提交时间线就会被不必要的合并提交所污染。更好的做法则是使用git rebase将一个feature分支变基到master分支:
$ git checkout feature $ git rebase master
这么做会将整个feature分支移动到master分支的起点,它会合并master分支上所有新的提交。不过,相比于使用合并提交来说,变基会通过在原来的分支中为每次提交创建全新提交来重写项目历史。变基的主要好处在于你会得到一个更加整洁的项目历史。此外,这里还有关于变基的陷阱的一些讨论。
2. 在执行git rebase后解决合并冲突
正如能力越大责任就越大一样。在执行git rebase时,你可能会遇到合并冲突的情况。合并冲突表示两个提交修改了同一个文件的同一行,Git不知道该应用哪一个修改。这会导致如下所示的错误消息:
Git会为你提供3个选择来修复导致冲突的提交(fa39187):
- 可以运行git rebase –abort来完全取消变基。这么做会取消变基修改,并将分支置回到执行git rebase之前的状态。
- 可以运行git rebase –skip来完全忽略该提交。这样,有问题的提交所引入的变化就不会被添加到历史中。
- 可以使用与合并冲突相同的标准步骤来解决冲突。
3. 临时性保存修改
在工作进行中时,有些东西常常会处于凌乱的状态。如果这时需要切换到不同的分支该怎么办呢?Git是不允许你这么做的,因为还有尚未保存的修改。坦率地说,你并不想将半成品提交上去,后面再来修改。这个问题的解决之道就是使用git stash命令。Stash会接收工作目录的当前状态(比如说,修改了的追踪文件与暂存区的修改等),并将其保存到未完成的修改栈中,这样后面随时可以再来修改。可以通过如下命令来暂存你的工作:
$ git stash Saved working directory and index state WIP on feature: 3fc175f fix race condition HEAD is now at 3fc175f fix race condition
现在,工作目录就是干净的了:
$ git status # On branch feature nothing to commit, working directory clean
这时就可以安全地切换分支做别的事情了。不过不必担心,暂存的提交依旧还在:
$ git stash list stash@{0}: WIP on feature: 3fc175f fix race condition
稍后,在回到feature分支后,你就可以取回所有暂存的变更了:
$ git stash pop On branch feature Changes not staged for commit: (use "git add ..." to update what will be committed) modified: index.html Dropped refs/stash@{0} (ac2321cc3a33ba712b8e50c99a99d3c20da9d6b8)
关于暂存,还有其他一些选项可用,如下所示:
$ git stash save "describe it" # give the stash a name $ git stash clear # delete a stashed commit $ git stash save --keep-index # stash only unstaged files
4. 克隆一个特定的远程分支
如果想要从远程仓库中克隆一个特定的分支该怎么做呢?通常你会使用git clone,不过这么做会将所有其他分支都一并克隆下来。一个便捷的方式是使用git remote add:
$ git init $ git remote add -t -f origin $ git checkout
5. 将cherry-pick远程提交合并到自己的分支中
更有甚者,如果只想将远程仓库的一个特定提交合并到自己的分支中该怎么做呢?可以使用git cherry-pick 来选择给定SHA值的提交,然后将其合并到当前分支中:
$ git cherry-pick
6. 应用来自于不相关的本地仓库的补丁
如果需要将另一个不相关的本地仓库的提交补丁应用到当前仓库该怎么做呢?答案就是下面这条命令:
$ git --git-dir=/.git format-patch -k -1 --stdout | git am -3 -k
7. 忽略追踪文件中的变更
如果你和你的同事操纵的是相同分支,那么很有可能需要频繁执行git merge或是git rebase。不过,这么做可能会重置一些与环境相关的配置文件,这样在每次合并后都需要修改。与之相反,你可以通过如下命令永久性地告诉Git不要管某个本地文件:
$ git update-index --assume-unchanged
8. 每隔X秒运行一次git pull
通常,合并冲突出现的原因在于你正在工作的本地仓库不再反映远程仓库的当前状态。这正是我们为什么每天早晨要首先执行一次git pull的缘故。此外,你还可以在后台通过脚本(或是使用GNU Screen)每隔X秒调用一次git pull:
$ screen $ for((i=1;i<=10000;i+=1)); do sleep X && git pull; done
9. 将子目录分隔为新的仓库
有时,你可能需要将Git仓库中某个特定的目录转换为一个全新的仓库。这可以通过git filter-branch来实现:
$ git filter-branch --prune-empty --subdirectory-filter master # Filter the master branch to your directory and remove empty commits Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (89/89) Ref 'refs/heads/master' was rewritten
现在,仓库会包含指定子目录中的所有文件。虽然之前的所有文件都会被删除,但他们依旧存在于Git历史中。现在可以将新的本地仓库推送到远程了。
10. 清理
有时,Git会提示“untracked working tree files”会“overwritten by checkout”。造成这种情况的原因有很多。不过通常来说,我们可以使用如下命令来保持工作树的整洁,从而防止这种情况的发生:
$ git clean -f # remove untracked files $ git clean -fd # remove untracked files/directories $ git clean -nfd # list all files/directories that would be removed
11. 将项目文件打成tar包,并且排除.git目录
有时,你需要将项目副本提供给无法访问GitHub仓库的外部成员。最简单的方式就是使用tar或zip来打包所有的项目文件。不过,如果不小心,隐藏的.git目录就会包含到tar文件中,这会导致文件体积变大;同时,如果里面的文件与接收者自己的Git仓库弄混了,那就更加令人头疼了。轻松的做法则是自动从tar文件中排除掉.git目录:
$ tar cJf .tar.xz / --exclude-vcs
12. 查找修改者
最后,如果出现混乱的情况,你一定想要找出是谁造成的。如果生产服务器宕机,那么找到罪魁祸首是比较容易的事情:只需执行git blame。该命令会显示出文件中每一行的作者,提交hash则会找出该行的上一次修改,还能看到提交的时间戳:
$ git blame
当然,Git命令是非常多的,除了上面介绍的12个重要命令外,相信各位InfoQ读者在日常工作过程中也有自己偏爱且好用的一些命令,不妨以评论的形式与其他读者一同分享。
http://www.techug.com/git-advanced-commands
相关推荐
Git是一种分布式版本控制工具,它允许...随着使用的深入,用户还需要掌握如解决冲突、重写历史、高级分支管理、使用钩子(hook)等更高级的Git命令和技巧。Git的使用是提高团队协作效率和代码管理能力的重要技能之一。
Git 是一个开源的分布式版本控制系统,它允许你跟踪代码的更改,并且可以与他人合作开发...根据你的具体需求,可能还需要学习更多的命令和 Git 的高级用法。 文件绿色安全,仅供学习交流使用,欢迎大家下载学习交流!
使用此命令可以启动一个守护进程,该守护进程允许其他用户通过网络访问您的Git仓库。 - **应用场景:** 如果您想要设置一个简单的本地服务器,供团队成员推送和拉取代码,可以使用这个命令。 #### 五、克隆与...
以上列举了Git中常用的命令及其使用场景,这些命令涵盖了Git的基础操作,如文件的添加、提交、撤销等,以及高级功能如分支管理、合并等。熟练掌握这些命令对于高效地使用Git进行版本控制是非常重要的。
以上只是Git命令的一部分,实际的"Git命令参考手册"包含更多细节和高级用法,如子模块、钩子、工作流策略等。通过深入学习并熟练掌握这些命令,开发者可以在团队协作和项目管理中更加高效地利用Git。对于任何想要...
`git commit` 是其中一个核心命令,用于将暂存区(staging area)内的更改正式记录到本地仓库的历史记录中。每次执行此命令时,Git 会在本地版本库生成一个唯一的 40 位哈希值(称为 commit-id),代表此次提交的...
创建一个新的Git代码库,你可以使用以下命令: 1. 在当前目录初始化Git代码库:`git init` 2. 在指定目录初始化Git代码库:`git init [project-name]` 3. 克隆远程仓库到本地:`git clone [url]` ### 配置 配置...
#### 二、Git高级命令 **37. `git remote add origin git@github.com:username/Hello-World.git`** - **功能**: 添加远程仓库。 - **示例**: `git remote add origin git@github.com:yourusername/yourrepo.git` ...
创建Git仓库,可以使用git init [project-name]命令开始一个新的本地仓库,或者使用git clone [url]来克隆一个已经存在的远程仓库到本地。 在进行变更时,可以使用git status查看哪些文件是新的或者被修改过的。...
Git是一种分布式版本控制系统,广泛用于软件开发中代码的版本控制和协作。学习和掌握Git的基本命令对于每一个参与软件开发的人员都至关重要。...不过,要成为Git高手,还需要不断实践和深入学习更多的高级命令和功能。
这些只是 Git 常用命令的一部分,实际上 Git 还有更多高级功能,如子模块、工作流管理等。通过熟练掌握这些基本命令,你可以有效地管理和协作你的代码库。记住,实践是提高 Git 技能的关键,多使用、多探索,你会...
这个压缩包包含了多个关于Git命令学习的资源,如图像、PDF文档等,旨在帮助用户深入理解和掌握Git的基本及高级操作。 首先,"git_cmd.jpg"可能是一张包含常见Git命令的图片,通常这种图片会用图形化的方式直观展示...
当您下载了一个新的项目,例如Linux内核,解压缩后,可以使用`git init`命令初始化仓库。 2. **.gitignore文件** - `.gitignore`文件用来指定哪些文件或目录不需要被Git追踪。对于大型项目,如Linux内核,避免将...
最终通过`git commit`命令将暂存区的内容提交到版本库中,形成一个新的版本。 - **暂存区**的作用:它是连接工作区和版本库的重要桥梁。只有暂存区的内容才会被提交到版本库,因此可以通过暂存区来控制哪些修改会被...
以上只是Git命令的一部分,实际使用中还有更多高级功能,如交互式重置(`git reset --interactive`)、合并冲突解决、cherry-pick(选择性合并)等。熟悉并掌握这些命令,将使你在版本控制和团队协作中更加得心应手。
以下是Git高级使用的一些命令: * git stash:暂存当前修改 * git stash pop:恢复暂存的修改 * git rebase:重新应用提交记录 * git cherry-pick <commit>:应用指定提交记录 * git tag <tagname>:创建新标签 * ...
### Git常用命令总结 #### 一、准备工作 **1.1 初始化仓库** ...以上是关于Git常用命令的一个较为全面的总结,涵盖了从基本操作到高级技巧的各种方面。掌握这些命令对于有效地使用Git进行版本控制是非常重要的。
在日常使用中,了解并熟练掌握Git的一些基本和高级命令是必要的。以下是一些Git常用命令及其应用的详细介绍: 1. **初始化仓库**: `git init` 当你开始一个新的项目时,你需要创建一个新的Git仓库。`git init`命令...
这份“git教程及git常用命令查询表.zip”压缩包包含了学习Git的基础和进阶知识,以及一个方便的命令查询表,非常适合初学者和需要快速查阅Git命令的开发者。 在Git教程中,你将学习到以下关键概念和操作: 1. **...
Git 是一个广泛使用的分布式版本控制系统,它允许开发者追踪和管理代码、文档的变更。下面将详细介绍Git的一些常用命令,帮助你更好地理解和使用Git。 1. **远程仓库操作**: - **克隆仓库**:`git clone <url>` ...