内容简介:本文介绍如何使用 Git Bash 命令行,提交代码、解决冲突,以及如何避免冲突。有助于理解 Android Studio 的 VCS 背后的原理。可以检出可见,本地分支名为 master,关联的远程分支名为 origin/master(origin 是主机名,master 是分支名)。
本文介绍如何使用 Git Bash 命令行,提交代码、解决冲突,以及如何避免冲突。有助于理解 Android Studio 的 VCS 背后的原理。
检出代码
检出远程仓库
git clone https://github.com/Yuloran/GitTutorial.git 复制代码
可以检出 origin/master 分支到本地,这是 GitHub 创建仓库时默认的 主机名/分支名 。使用 git branch -vv 查看本地分支状态:
可见,本地分支名为 master,关联的远程分支名为 origin/master(origin 是主机名,master 是分支名)。
检出远程分支
很多时候,配置管理员需要新建很多远程分支,以进行同一项目不同版本的并行开发。比如,有的分支用于需求开发,有的分支用于 Bug 修复等。此时,我们需要检出各自对应的分支,修改并提交代码。
同步远程分支
管理员新建远程分支后,我们需要先同步一下远程分支,才能看到新建的分支:
如上图所示,先使用 git branch -a 查看本地和远程所有分支,发现并没有管理员新建的 bug_fix 分支,此时输入 git fetch ,提示有一个新分支 bug_fix 。再次输入 git branch -a 查看所有分支:
嗯,确实多了一个 bug_fix 分支。
检出远程分支
git checkout -b bug_fix -t remotes/origin/bug_fix 复制代码
checkout -b 表示新建本地分支, bug_fix 为本地分支名,你也可以起别的名字。 -t 表示追踪远程分支(track), remotes/origin/bug_fix 为远程分支名,查看检出结果:
输入 git branch 查看当前所在的本地分支:
输入 git status 查看当前分支状态:
提示你目前修改是最新的,没有任何修改可以提交。
提交代码
不良习惯
很多开发人员,喜欢在一个本地分支上,连续提交代码。这是一个很不好的习惯,尤其是在多人协作的情况下。这会导致每笔提交之间存在依赖关系,即使每笔修改之间毫无瓜葛。进而可能导致 merge 冲突、 cherry-pick 合入冗余代码。而且,如果你突然发现,上上一笔提交有问题的时候,我觉得你可能有种想 shi 的感觉。
正确姿势
保留一个本地分支,专门用于同步代码。
比如,我们现在需要在 master 分支上做一个需求,首先输入 git status 查看本地 master 分支的状态:
提示本地有修改文件,没有提交。咋整呢?有两种处理方法:
- 啥也不管,直接输入
git pull进行同步,有冲突会自动合并,合并不了再手动解决。-> 不推荐,可能会在本地产生一条 merge 记录 - 先将本地修改
stash save,再使用git pull --rebase进行同步,最后将暂存的修改stash pop,有冲突会自动合并,合并不了再手动解决。-> 推荐,自动变基,不会在本地产生 merge 记录
1. 暂存代码
git stash save [-u] 'update readme.md' 复制代码
[-u] 表示参数可选,加 -u 会将本地新增文件也暂存,不加则仅暂存本地修改部分。 'update readme.md' 为描述,下面列出 git stash 支持的所有操作:
git stash list
git stash show stash@{0}
git stash pop stash@{0}
git stash drop stash@{0}
git stash clear
2. 同步代码
git pull --rebase 复制代码
同步结果:
提示已经是最新的。如果本地代码不是最新的,应当类似于下图:
3. 弹出暂存代码
git stash pop [stash@{0}]
复制代码
[stash@{0}] 表示可选,不加默认弹出栈顶元素,也可以指定弹出哪一个暂存记录。弹出结果如下:
提示有冲突。莫要惊慌,有冲突解决就是了,毕竟咱们干的都是“小项目”,除非文件换行符变了,否则不会冲突太多。像 AOSP 、 Mokee 那种大型项目,发生冲突才是坑爹。比如国内的手机厂商,每次大版本升级时(比如从 Android 8.0 升到 Android 9.0),都需要花几个月的时间才能使版本稳定,这也是为什么国产手机安卓版本总是落后于 Google 的原因。扯远了,还是先 git status 看一下工作区状态:
原来是 README.md 文件修改冲突了,而且 Git 还贴心地提示你:
git reset HEAD <file> git add <file>...
我们先使用 git diff <file> 看看哪里冲突了:
git 使用:
<<<<<<< Updated upstream ======= >>>>>>> Stashed changes 复制代码
标记冲突状态, ======= 上面的是远程仓库上别人的修改,下面的是我们的本地修改。嗯,这个冲突是我人为制作的,所以比较简单。在 IDE 中手动解决该冲突后,使用 git add README.md 命令标记冲突已解决:
README.md 咋变原谅色了呢?因为我们刚才用了 git add 命令,将其添加到了暂存区,所以上面显示的是 Changes to be committed ,也就是待提交。提交啥啊,刚解决完冲突,需求还没做呢!所以,我们使用 git reset <file>... 命令,将其从暂存区撤出:
<file>... 表示可选,不加即撤出所有,加了即撤出指定的文件。 Linux 帮助手册中很多使用 <arg> 或者 [arg] 表示参数可选, <> 和 [] 是不需要输入的,这个已经成为开发人员的习惯用法。
4. 新建本地分支
很多人这个时候,就直接在本地 master 分支上疯狂输出需求代码了。NO!我们应该针对不同的开发内容,新建不同的本地分支。比如 feature_shopping , bugfix_tombstone 等等,假设我们现在需要实现一个购物功能,我们应该使用 git checkout -b feature_shopping 新建一个本地分支来实现这个需求:
5. 提交代码
连续通宵5天后,我们的需求终于做完了,可以提交代码了:
git commit -m "update README.md" 表示将修改提交到本地仓库,此时还没有推送到远程仓库。 -m 后面的是修改描述,这是一种简便写法。而大公司都会对提交的描述有格式要求,所以需要先配置 commit 模板:
git config --global commit.template ~/.gitmsg 复制代码
编辑该模板:
输入 git commit :
模板已经生效了,输入修改描述即可。我这里配置的 Git 编辑器是 vim,你也可以配置成别的:
git config --global core.editor notepad 复制代码
这样,就可以用记事本来编写修改描述了。
6. 追加提交
commit 之后,本地又修改了一些文件,此时需要使用 git commit --amend 追加提交:
7. 回退提交
commit 之后,发现提交多了,把不需要提交的也提交了,此时需要回退,有两种方式:
-
git reset [--soft] commit_id,软回退,不会丢弃文件修改记录,--soft不加也可以。 -
git reset --hard commit_id,硬回退,丢弃所有修改。一般仅在需要回退到指定节点验证问题时使用。
查看 commit_id:
git log -1 复制代码
-1 表示只查看提交记录里的最后一条:
输入 git reset 306c8b26360adfbdb3992f62514e8d58626f2d20 ,即可回退提交。然后重新 git add <file>... , git commit 。
8. 推送代码
commit 之后很多人就直接 git push 了,这是不对的,应当先同步代码。由于我们现在在新建的本地分支 feature_shopping 上,这个分支没有关联远程分支,所以无法也不应该使用 git pull --rebase 来同步代码。正确的操作为:
-
git checkout master:切到本地主分支 -
git pull --rebase:同步代码 -
git checkout feature_shopping:切换到本地需求分支 -
git rebase master:将本地主分支代码,合入到本地需求分支(可能有冲突,按照 Git 的提示修复即可) -
git push origin HEAD:refs/for/master:将本地需求分支的提交推送到远程master分支
结语
Git Bash 每一个命令的操作结果,成功或者出错的描述都很详细。遇到问题的时候,只要按照提示,一步步操作,一般都能解决。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Don't Make Me Think
Steve Krug / New Riders Press / 18 August, 2005 / $35.00
Five years and more than 100,000 copies after it was first published, it's hard to imagine anyone working in Web design who hasn't read Steve Krug's "instant classic" on Web usability, but people are ......一起来看看 《Don't Make Me Think》 这本书的介绍吧!