个人 Git 学习总结

133 阅读5分钟

1. 基本操作

  • 代码上传前记得忽略不必要的文件,包括 package-lock.js.git
  • 查看配置信息:git config -l
  • 查看远程仓库:git remote / git remote -v
  • 查看远程分支:git branch -r

2. 合并远程仓库代码并提交的步骤

git add .
git commit -m "" / git commit --amend //修补式提交,记得把#去掉
git pull --rebase //衍合远程最新代码,若 pull 时没有加上 --rebase 选项,将导致当在拉取上游更新时产生合并提交,合并提交不会被 Gerrit 接受
或(如果要拉取远程的某个提交,使用cherry-pick)
{
    git status -s// 文件名前面显示 UU 的就是未解决冲突的文件
    git add 冲突文件 # 添加修改后的文件到缓存区
    git commit -a --amend
    git rebase --continue || git merge --continue # 继续rebase或者merge
    git log # 如果rebase成功,表示冲突已解决,此时可以查看log
    git commit --amend # 修改最后一次提交,包括文件与注释
}
git push origin HEAD:refs/for/master

假如评审未通过,被打回修改后,再次提交时忘了在 git commit 添加 --amend 参数,导致新生成了一个评审任务。这时的处理方式如下:首先,进入评审任务页面,点击 Abandon 按钮放弃此变更;然后,依次执行 git reset --soft HEAD^git commit --amend,再重新 push

若在gerrit上点击submit按钮之后发生冲突

git pull --rebase    # 同步代码,如果没有提示冲突,直接跳到最后一步 push
git status -s
# <编辑冲突文件>
git commit -a --amend
git rebase --continue
git push origin HEAD:refs/for/master

3. 远程与本地

3.1 将本地分支推送到远程指定分支上

// git push origin <本地分支名>:<远程分支名>
// git push origin HEAD:refs/for/<branch-name>
git push origin HEAD:refs/for/master

3.2 将远程指定分支拉取到本地当前分支上(一般用cherry-pick

​ git clone -b dev 代码仓库地址 (dev是分支名称)

git pull origin <远程分支名>

3.3 在本地新建分支并跟踪远程指定分支

git checkout -b local_branch_name origin/branch_name

3.4 删除远程分支

推送一个空分支到远程分支,其实就相当于删除远程分支:
$ git push origin :localbranch
也可以使用:
$ git push origin --delete localbranch

3.5 refs/for

git push <remote 名字> <本地分支的名字> : <远程库的名字>
git push origin HEAD:refs/for/master
git push 推送
origin: 远程的库的名字
HEAD: 是一个特别的指针,它是一个指向你正在工作的本地分支的指针,可以把它当做本地分支的别名,git这样就可以知道你工作在哪个分支
refs/for: 意义在于我们提交代码到服务器之后是需要经过code review之后才能进行merge的

3.6 amend已推送到远程的非最近一个提交

步骤:

1.使用 git rebase -i [commit-id] 修改本地HEAD指针指向 // commit-id为要修改提交的上一个提交
2.将要修改提交前面的 pick 改为 edit
3.修改代码
4.git add .
5.git commit --amend
6.git rebase --continue

4. git cherry-pick

git cherry-pick可以理解为”挑拣”提交,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用git cherry-pick

  • 用法:
git cherry-pick [<options>] <commit-ish>...
常用options:
      --quit                退出当前的chery-pick序列
      --continue            继续当前的chery-pick序列
      --abort               取消当前的chery-pick序列,恢复当前分支
      -n, --no-commit       不自动提交
      -e, --edit            编辑提交信息
git cherry-pick A^..B //[A,B], commit time:A<B, 如果AB顺序出错,则报错error: empty commit set passed
git cherry-pick A..B //(A,B], commit time:A<B
  • 举栗:切换到B分支上合并A分支上的commit
  1)git checkout B
  2)git cherry-pick -n commitId
  3)git status //查看是哪些文件发生冲突, 红色的为有冲突的文件
  4)解决冲突
  5)git add .//git add相当于标记为已解决
  6)git cherry-pick --continue

5. 合并commit

6. git stash

参考文章:zhuanlan.zhihu.com/p/364339115

使用流程:

  1. 将修改保存到分支 A
  2. 运行 git stash
  3. 签出分支 B
  4. 修正 B 分支的错误
  5. 提交并(可选)推送到远程
  6. 查看分支 A
  7. 运行 git stash pop 来取回你的暂存的改动
  • git stash pop 弹出最近一次stash的内容
  • git stash list 查看当前stash的所有内容
  • git stash clear 清除所有stash的内容

7. git清除缓存

.gitignore 文件用来指定需要排除在版本管理之外的文件或目录。最近发现一个问题,如果某个文件或文件夹之前是在版本管理内的,并且进行过提交,事后想加入 .gitignore 中,并不生效。 ​ 解决方法:清空 git 本地的缓存再提交一次

git rm -r --cached .
git add .
git commit -m "fixed untracked files"

8. 导出git log日志

xxx.log是可自定义的名称,栗子中的目录:C:\Users\username\Desktop

  • 格式化版
  git log --pretty=format:"%ai , %an: %s" --since=“100 day ago” >> ~/Desktop/commit.log
  • 详细版
  git log --since ="180 day ago" >> ~/Desktop/commit2.log

9. 撤销提交

使用:git reset --soft HEAD^git reset --soft HEAD~1 , 如果想撤回两次commit 使用git reset --hard HEAD~2

  • --hard表示:删除工作空间改动代码,撤销commit,撤销git add . ,完成这个操作后,就恢复到了上一次的commit状态
  • --soft表示:不删除工作空间改动代码,撤销commit,不撤销add,被撤销的commit修改会放回暂存区中 (优先选择)
  • --mixed表示:默认参数,不删除工作空间改动代码,撤销commit,并且撤销add,git reset --mixed HEAD^git reset HEAD^ 效果是一样的。

10. git push 提交某一个commit

步骤:

  1. 基于远程工作分支develop的最新节点创建并切换到新的分支test
   git checkout -b test remotes/origin/develop
  1. 将我们想要单独推送的提交commit1,cherry-pick到当前分支test1上
   git cherry-pick commit1
  1. 直接push到工作分支develop
   git push origin HEAD:refs/for/develop