Git

210 阅读6分钟

1.git hooks

Git Hooks 就是那些在Git执行特定事件(如commit、push、receive等)后触发运行的脚本。

按照Git Hooks脚本所在的位置可以分为两类:

1.本地Hooks,触发事件如commit、merge等

2.服务端Hooks,触发事件如receive等

2.Git Hooks能干什么

gitHooks是定制化的脚本程序,所以它实现的功能与相应的git动作相关,在实际工作中,GitHooks还是相对比较万能的:

  • pre-commit:检查每次的commit message是否有拼写错误,是否符合某种规范
  • pre-receive:统一上传到远程仓库的代码编码
  • post-commit:每当有新的提交的时候就通知项目成员
  • post-receive:将代码推送到生产环境

Git Hooks是如何工作的

每个Git repo 下都含有.git/hooks

这个目录(本地和远程都是一样的),这里面放置Hooks的地方

3.git  修改之前的commit信息 

详情

3.修改最后一次注释内容

如果你只想修改最后一次注释(就是最新的一次提交),那好办:
git commit --amend
出现有注释的界面(你的注释应该显示在第一行), 输入i进入修改模式,修改好注释后,按Esc键 退出编辑模式,输入:wq保存并退出。ok,修改完成。

修改之前的注释

修改之前的某次注释

  1. 输入:
    git rebase -i HEAD~2
    最后的数字2指的是显示到倒数第几次 比如这个输入的2就会显示倒数的两次注释(最上面两行)
  • 你想修改哪条注释 就把哪条注释前面的pick换成edit。方法就是上面说的编辑方式:i---编辑,把pick换成edit---Esc---:wq.

  • 然后:(接下来的步骤Terminal会提示)
    git commit --amend

  • 修改注释,保存并退出后,输入:
    git rebase --continue

其实这个原理我的理解就是先版本回退到你想修改的某次版本,然后修改当前的commit注释,然后再回到本地最新的版本

修改之前的某几次注释

修改多次的注释其实步骤和上面的一样,不同点在于:

  1. 同上
  2. 你可以将多个想修改的commit注释前面的pick换成edit
  3. 依次修改你的注释(顺序是从旧到新),Terminal基本都会提示你接下来的操作,每修改一个注释都要重复上面的3和4步,直到修改完你所选择的所有注释

已经将代码push到远程仓库

首先,你把最新的版本从远程仓库先pull下来,修改的方法都如上,最后修改完成后,强制push到远程仓库:
git push --force origin master
**注:很重要的一点是,你最好保证在你强制push之前没有人提交代码,如果在你push之前有人提交了新的代码到远程仓库,然后你又强制push,那么会被你的强制更新覆盖!!!
**

4. GIT撤销操作

git commit   --amend        撤销上一次提交  并讲暂存区文件重新提交
git checkout -- <file>     拉取暂存区文件 并将其替换成工作区文件
git reset HEAD  -- <file>  拉取最近一次提交到版本库的文件到暂存区  改操作不影响工作区
git reset --hard HEAD 撤销到该commit
git revert HEAD 撤销到该commit

撤销文件的修改

git log --oneline
git reset <HEAD> -- <file>
git status
git checkout -- <file>

5. git push 错误failed to push some refs to 解决办法

原因:

当我们在git版本库中发现一个问题后,如你在git上对它进行了在线修改,但是没有对本地库进行同步(做到push前,都要先pull代码的习惯,就可以保证本地库和远程库代码一致)。这个时候,你再次commit,想把本地库代码提交到远程git库中,就回出现push失败的问题。

解决:

5.1

根本原因就是远程仓库与本地仓库代码不一致导致的,我们只需要把远程仓库同步到本地仓库即可:git pull --rebase origin master

指令的意思就是把远程仓库中的更新合并到本地库中(可能存在冲突需要解决)--rebase 的作用是取消本地库中刚刚提交的commit,并把它们接到更新后的版本仓库中

5.2

或者使用如下命令,将commit的代码撤回,然后git pull 

git reset --soft HEAD^

6. git stash 用法总结

git stash save "xxx" // 执行存储时,添加备注,方便查找

git stash list //查看stash 了哪些存储

git stash show //显示做了哪些改动,默认show第一个存储,如果想用显示其他的,git stash show stash@{1}显示第二个

git stash show -p  // 显示第一个存储的改动, git stash show stash@{1} -p

git stash apply // 应用某个存储,但是不回把存储从存储列表中删除,默认使用第一个 git stash apply stash@{1}

git stash pop // 命令恢复之前缓存的工作目录,并将缓存堆栈中的对用stash删除  git stash pop stash@{1}

git stash drop stash@{num}// 丢弃stash 从列表中删除这个存储

git stash clear // 删除所有的缓存的stash

7. git  rm 和 git rm --cached 区别

 当需要删除暂存区或分支上文件,同时工作区不需要这个文件

git rm filename

当需要删除暂存区或分支上的文件,同时工作区需要这个文件,但是需要被版本控制

git rm --cache filename

# 后面添加进.gitignore文件中的文件可以使用这条命令解除版本控制的追踪,然后在commit上忽略这个文件。

8.删除具体某个commit方法

git log // 获取commit的信息
git rebase -i (commit_id) // commit_id 为删除的commit的上一个commit号;
编辑文件,将要删除的commit之前的 pick 修改为drop
按照提示保存文件退出
git push origin 分支 --force

通过这种方式就可以删除某一次的commit并且不会影响到之后的commit

8.修改某次提交记录/某次提交人的信息

  1. git rebase -i HEAD~N, 如 git rebase -i HEAD~5, 显示历史的前5个提交记录

  2. 将要修改的提交的 pick 改成 edit :

  3. :wq 保存退出

  4. git commit --amend --reset-author, 在操作页面,:wq 保存退出

  5. git rebase --continue 回到正常状态

  6. git rebase --abort 放弃本义修改

如果你只需要修改最新的 commit ,直接使用:

git commit --amend --author="Author Name <email@address.com>"
复制代码

如果你已经修改了 git config 中的用户名和邮箱,也可以使用

git commit --amend --reset-author --no-edit

作者:sjfkai
链接:juejin.cn/post/684490…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。