git命令的使用

常用命令

  1. git clone - 从远程仓库克隆代码

  2. git add - 添加文件到暂存区

  3. git commit - 提交代码到本地仓库

  4. git push - 推送到远程仓库

  5. git pull - 拉取远程仓库更新

  6. git checkout - 切换分支

  7. git branch - 新建/列出分支

  8. git merge - 合并指定分支

  9. git log - 查看提交记录

  10. git status - 查看文件状态

  11. git diff - 比较差异

  12. git reset - 回退版本

  13. git revert - 撤销提交

  14. git tag - 给指定提交打标签

  15. git stash - 暂存当前进度

  16. git rm - 删除文件

命令详解

git commit –amend

用来修改最后一次提交记录,示例如下

  1. 修改最近一次的提交记录历史
1
git commit --amend "new commit history"
  • 有新变动产生的文件
1
2
git add .
git commit --amend
  • 修改提交时间
1
git commit --amend --date="Fri Jan 1 00:01:00 2021 +0800"

–no-ff

它是git merge命令的一个选项。它表示禁用快进(fast-forward)合并。

默认情况下,当执行git merge命令时,如果要合并的分支没有作任何新的提交,那么Git会直接将当前分支指向要合并的分支,而不会创建新的合并提交。这就是快进合并。快进合并会导致分支历史变得线性,并且合并后的分支结构可能会丢失。

在实操中过多的历史提交对于分支管理是不必要的操作,而使用--no-ff选项进行合并时,Git会创建一个新的合并提交,无论要合并的分支是否有新提交。这样可以保留分支的结构,每个分支的变化都可以跟踪到。

使用--no-ff选项的合并命令示例:

1
git merge --no-ff branch-name

使用这个命令合并之后,新的分支将产生一个总的合并历史,记录合并的操作和相关的提交信息,这可以更清楚地表示分支之间的合并历史。

解决冲突

Git pul时出现的故障

出现了以下错误:error: Your local changes to the following files would be overwritten by merge,这个错误一般是本地有修改时拉取了远程分支,导致本地分支和远程分支出现了冲突。需要先解决冲突后再进行合并,解决方案是采用git stash命令。如果本地没有需要保存的内容可以直接丢弃本地内容,直接拉取分支。

  1. 首先将修改内容暂存到暂存区中
1
2
3
git stash
# 查看暂存区的内容
git stash list
  • 拉取远程分支到本地
1
git pull
  • 将暂存区的内容释放,若有冲突首先解决冲突
1
2
3
git stash pop
# 清空暂存区
git stash clear

如果暂存区中保存了多个记录,pop将按照栈先入后出的顺序弹出。也可以不弹出暂存区内的内容,但是先应用到本地分支

1
git stash apply
  • 放弃指定的暂存区
1
git stash drop ***

本地分支和远程分支都有提交记录导致冲突

  1. 首先拉取远程分支的提交记录
1
git fetch
  • 此时本地将共存远程分支和本地分支的所有内容,对当前分支内容采用合并命令
1
git merge

此时会出现merge confict的错误

1
2
3
Auto-merging merge.txt
CONFLICT (content): Merge conflict in merge.txt
Automatic merge failed; fix conflicts and then commit the result.

使用git status查看文件的状态,在都修改的文件上会出现both modified的标注,同时打开这个文件在修改的地方会出现以下内容

1
2
3
4
5
6
7
这是第一行,这行不会被修改
<<<<<<< HEAD
这是第二行
我在master分支上添加了第三行
=======
我在new_branch分支上修改了第二行
>>>>>>> new_branch

这些记号是标记冲突内容的分隔线,解释如下:

  • <<<<<<< HEAD=======之间的内容:是master分支修改的内容(准确来说是HEAD指针指向的分支修改的内容);

  • =======>>>>>>> new_branch之间的内容:是new_branch分支修改的内容;

  • 分割线之外的内容:是两个分支都没有改动的内容

要解决这个冲突只需要删除不需要的内容即可,同时出现的特殊符号也需要全部删除。

  • 完成以上的内容后,按照新的commit记录进行操作即可
1
2
3
git add 文件
git commit -m "merge history"
git push

无法提交仓库

问题描述:

第一次从gerrit仓库clone代码之后,对开发内容进行commit,这个时候直接进行push操作,可能会出现push失败的情况,如下面的提示

问题解决:

这个错误产生的原因是因为commit记录没有自动生成change-id,要想push代码成功,首要任务是解决change-id的生成。change-id由commit-msg文件自动生成,

解决方案在错误提示中已经很明确了,按照操作即可修订错误。

  1. 复制命令
1
f="$(git rev-parse --git-dir)/hooks/commit-msg"; curl -o "$f" http://gerrit.it.chehejia.com:8080/tools/hooks/commit-msg ; chmod +x "$f"
  • 重新commit加入changId
1
git commit --amend --no-edit
  • 检查是否生成changId
1
git log

问题

前端项目每次都需要重新生成change-id

husky与gerrit冲突,导致每次都需要重新生成change-id,指定路径之后即可解决

执行下面的命令

1
git config core.hooksPath '.git/hooks'

项目在commit的时候总是无法生成changeId,导致无法推送到远程,原因和上面的一样,需要指定git hooks