Git基本使用指南
前言
开发过程中会遇到各种各种的问题,我们必须要代码稳定,这个时候就需要版本管理工具了,有了版本管理工具,遇到bug的时候,就可以自己新开一个分支然后在分支上解决该 bug, 解决之后然后在合并到开发分支就好。既能保证现有代码的质量还能更好的解决问题。 以前的开发方式比较混乱,好多人都在往一个分支上提交代码,这样不能保证项目的稳定性,也比较危险,如果那个人 执行了 git push origin :develop 就会将开发分支的代码删除掉,这下子如果之前没有和 master 上的代码合并过的话,那就损失惨重了。好像也没有办法 review 代码,所以使用正式的开发流程,git 工作流; git 工作流的过程:创建分支 develop 作为开发分支,等开发的差不多了,经过测试可以使用,合并到 master 主干上,然后通过主干分支 release 版本。所以这个时候 develop 分支其实就充当了一个缓冲分支。develop 分支大家可以一起开发,如果某个人的功能相对改动量比较大的话,自己可以在自己的本地创建一个分支,用于自己功能特性的开发。等时机成熟然后合并到 develop ,然后在 push 到远端。 因为在开发中我们经常会使用tag 命令对项目进行打 tag, 标记这个版本是在哪个具体的时间点,比如我们开发项目中版本 1.8.6.14306有问题的话,那么我们需要检出当前时刻的版本号码,在对应的时刻修复bug.修复完成之后合并到主干分支就好。
常用基本命令
创建仓库
-
本地创建仓库
- Git全局设置
$ git config --global user.name "weiTeng" $ git config --global user.email "[email protected]"
- 本地没有已经存在的仓库
# 创建本地仓库目录 $ mkdir pinyougou $ cd pinyougou # 创建本地仓库 $ git init $ touch README.md $ git add README.md # 提交到本地 $ git commit -m "Add README.md" # 设置远程的仓库地址 $ git remote add origin https://gitee.com/ywtty/pinyougou.git # 推送到远程仓库 $ git push -u origin master
- 本地已经存在的仓库
# cd pinyougou # git remote add origin https://gitee.com/ywtty/pinyougou.git # git push -u origin master
- 新修改最新的提交,改正作者和提交者的错误信息
$ git commit --amend --allow-empty --reset-author
说明:
- 参数
--amend
是对刚刚的提交进行修补,这样就可以改正前面错误的提交(用户信息错误),而不会产生另外的新提交。 - 参数
--allow-empty
是因为要进行修补的提交实际上是一个空白提交,Git默认不允许空白提交。 - 参数
--reset-author
的含义是将Author(提交者)的ID重置,否则只会影响最新的Commit(提交者)的ID。这条命令也会重置AuthorDate信息。
-
克隆仓库
$ git clone https://github.com/weiteng4droid/MineWidget.git // 或者使用 ssh 方式克隆分支 $ git clone [email protected]:weiteng/oa.git // 克隆指定的分支:如 develop 分支 $ git clone -b develop https://github.com/otale/tale.git
更新分支
-
从远端分支获取最新到本地不合并
$ git fetch origin master 从远端的master分支下载最新版本代码 $ git fetch 获取服务端最新的分支及tag等 $ git log -p master..origin/master 比较本地master分支和origin/master分支的差别 $ git merge origin/master 合并远端分支最新的代码到本地
-
直接从远端的分支更新到本地并合并
$ git pull origin master 更新远端 master 分支代码并合并到本地的 master 分支
提交代码本地
-
添加本地修改并提交
# 添加代码到本地的暂存区 $ git add . # 进入编辑器界面查看修改变更,并填写修改日志 $ git commit --verbose
-
提交远程
# 查看提交的修改的代码并写提交的备注 $ git push origin master 提交到远程的分支 $ git push -f 强制覆盖远程分支
-
查看提交日志
# 显示提交日志 $ git log # 显示日志,提交的文件变更统计 $ git log --stat commit 2cc71c49361293636e0ccc493e6c4dcf81e70def (HEAD -> master) Author: weiTeng <[email protected]> Date: Mon Dec 10 10:51:03 2018 +0800 添加新的程序文件 Signed-off-by: weiTeng <[email protected]> Demo.java | 8 ++++++++ test.py | 2 ++ 2 files changed, 10 insertions(+)
回滚代码
$ git reset --hard <提交的摘要啥sha1值> 回滚到这一次提交
$ git reset --soft <提交的摘要啥sha1值> 回滚到这一次提交
两者的区别:
hard: 就会导致原来的提交的代码丢失;
soft: 之前修改的代码不会丢失,会放到暂存区。
解决冲突
可以使用git 工具内部的 vim 编辑器进行解决,建议使用桌面图形化工具处理冲突,效率比较高。或者使用桌面客户端工具。
修改Commit log
有时候发现提交代码的 log 写错了,这个时候可以修改提交的log
$ git commit -m "修改相关bugg"
发现多写了一个 g, 可以使用如下的命令来修改提交日志。
$ git commit --amend
会进入一个 vim 的界面,然后修改首行的提交日志即可。
分支操作
查看所有分支
$ #git branch -a:列出所有的本地分支以及远程的分支
查看远端分支
$ git branch -r:列出远端仓库的所有分支
查看本地分支
$ git branch
带*号的表示当前所在的分支。
同步远程分支到本地
$ git fetch 同步服务端最新的分支以及 tag 到本地。注意,git fetch 更新到分支的代码并不会自动合并,如何需要再次合并的操作话,需要操作 git merge origin/xxx, xxx表示当前的分支。
删除本地分支
$ git branch -d <branch_name> 删除本地已经合并的分支
$ git branch -D <branch_name> 删除未合并的分支
重命名分支
$ git branch -m <old_branch_name> <new_branch_name>
删除远程分支
$ git push origin :<branch_name> 删除远程分支可能无法恢复
$ git push origin --delete <branch_name>
以上两个命令删除远程分支都不可恢复
创建分支
$ git branch <branch_name> 分支名称
$ git branch -b <branch_name> 创建分支并切换分支
切换分支
$ git checkout <branch_name>
切换分支之前需要提交本地或者当前的分支的代码,否则可能会导致当前分支的代码丢失。
合并分支
某个分支的代码开发到一定程度的时候需要向主要分支(master、develop)合并,以用于后续的测试,发布操作等。切换到合并的分支下, 如:
git checkout master
被合并分支合并到主分支, 如:git merge bugFix
以上完成了,bugFix 分支到主干分支(master)的合并,合并之后 bugFix 的新特性将存在于 master 分支上。
- 注意:分支合并之后可能会出现很多冲突,可以借助 IDE 工具解决冲突, 然后可以删除不必要的分支,保留主干。
rebase
命令的使用
$ git checkout mywork
$ git rebase develop
这些命令会把你的 `mywork`分支里的每个提交取消掉,并且把它们临时保存为补丁(这些补丁放到`.git/rebase`目录中),然后把 “mywork”分支更新到最新的 'develop'分支,
最后把保存的这些补丁应用到‘mywork’分支上。如果在操作的过程中出现任何问题,任何时刻可以终止。
发布分支
// 发布分支指的是同步相应分支的代码到远程仓库
$ git push origin <branch_name> 提交并发布分支
标记操作
暂存区
-
保存当前代码到暂存区
$ git stash
-
查看暂存区列表
$ git stash list # {0}: 表示第一个暂存的内容 [email protected]{0}: WIP on master: f6e6cba 更新 README.md
-
恢复暂存区内容
# 表示恢复第一个暂存区暂存的内容 $ git stash pop
切换指定 tag 下查看并修复bug
$ git checkout -b bugFix v1.8.6.14306 : 会创建一个新的分支 bugFix, 然后将tag 的代码克隆进去
里程碑--标签(可以列出仓库所有的标签)
-
列出仓库(本地仓库)中的所有标签
git tag
-
查看标签的详情信息
git show <tag_name>
创建标签
-
创建普通标签
$ git tag -a <tag_name> 例如: git tag -a v1.0.2
-
创建附注标签
$ git tag -a v1.0.2 -m "修复了xx bug",修复了某个版本的bug 的时候创建的标记
注意:轻量标签是指向提交的引用,附注标签则是仓库中的一个独立的对象。所以建议使用附注标签。
删除标签
-
删除本地标签
$ git tag -d <tag_name> 例如: git tag -d v1.0.2
-
删除远程标签
$ git push origin :refs/tags/<tag_name> $ git push origin --delete <tag_name>
例如:
$ git push origin :refs/tags/v1.0.2 $ git push origin --delete v1.0.2
发布标签
-
推送指定标签到远程服务器
$ git push origin <tag_name> 例如: git push origin v1.0.1
-
推送本地的所有标签到服务器
$ git push --tags
注意: tags 前边两个中划线, 推送本地所有的分支到远程仓库。 切换到指定的标
git checkout <tag_name> 例如: git checkout v1.0.1
注意:不建议这么做,因为这样操作会导致,header 指针向前移动,可能会导致代码的丢失,建议创建的一个新的分支,然后 checkout 一个 tag 的代码。
git 忽略规则
仓库中已经添加过了 .gitignore 文件规则内的文件导致忽略失效的解决方法; 失效产生的原因是由于我们在创建本地仓库的时候,没有加载 .gitignore 文件,然后提交了,后续加入的 .gitignore 文件就不会被 git 扫描,而失去作用。
-
后加入忽略文件清理缓存
$ git rm -r --cached xxx,-r 代表递归删除,对xx文件夹中的所有文件处理,取消掉 git 的控制缓存,如果是文件,不用加上 -r)
然后再次提交
git commit -m "Remove xx 文件或者文件夹"
提送远程$ git push origin <branch_name>
-
整体情况下,应该先添加 .gitignore 文件到本地仓库中,然后,添加添加代码,这样忽略规则是正常启用的。
常见问题:
提交代码后发现提交日志中显示的用户名和邮箱不对的修改办法
-
修改当前仓库或者工程的用户名和邮箱
$ git config user.name # 显示当前的用户名 $ git config user.name "weiTeng" # 修改当前的仓库用户名为weiTeng $ git config user.email # 显示当前的用户邮箱 $ git config user.email "[email protected]" # 设置当前的用户的邮箱
-
修改全局配置
$ git config --global user.name # 显示全局用户名 $ git config --global user.email # 显示全局的用户邮箱
Can't update: no tracked branch
No tracked branch configured for branch oem.
To make your branch track a remote branch call, for example,
git branch --set-upstream oem origin/oem
Commit failed with error:
Unable to create 'C:/Users/xxxx/git/xxxxx/.git/index.lock': File exists.
If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.
-
解决方法:
# linux系统命令行 $ rm -f .git/index.lock # windows系统命令行 > del .git\index.lock
提示警告信息
warning: LF will be replaced by CRLF in xx/xxx.xml.
-
问题产生的原因:
windows 中的换行符为CRLF,而在linux下的换行符号为LF,在执行git add.命令的时候在命令行窗口中会自动的替换为了linux的LF。
-
解决方法:
# git config core.autocrlf false 禁用自动转换换行符。