GIT 奇技淫巧
转移仓库的Commit
git remote -v
// 删除原本的远程repo
git remote rm origin
// 添加新的远程repo
git remote add origin ssh://username@xxx.xxx.xxx/new/repo
git push -u origin --all
git push -u origin --tags
ADD
选择需要提交的内容(交互模式)
git add -p
git v1.x
Git Version 1.x | 新文件 | 被修改的文件 | 被删除的文件 | 是否受当前所在目录限制 | 说明 |
---|---|---|---|---|---|
git add -A. | ✅ | ✅ | ✅ | ❌ | 将当前整个工作区中所有的文件改动提交至暂存区,包括新增、修改和被删除的文件,不受当前所在目录限制 |
git add . | ✅ | ✅ | ❌ | ✅ | 将当前工作区中当前目录(包括子目录)下的所有新文件和对已有文件的改动提交至暂存区,但不包括被删除的文件 |
git add -u. | ❌ | ✅ | ✅ | ❌ | 将当前整个工作区中被修改和被删除的文件提交至暂存区。而新文件因为未被跟踪(untracked),所以不会被提交至暂存区 |
git v2.x
Git Version 2.x | 新文件 | 被修改的文件 | 被删除的文件 | 是否受当前所在目录限制 | 说明 |
---|---|---|---|---|---|
git add -A | ✅ | ✅ | ✅ | ❌ | 将当前整个工作区中所有的文件改动提交至暂存区,包括新增、修改和被删除的文件,不受当前所在目录限制 |
git add . | ✅ | ✅ | ✅ | ✅ | 将当前工作区中当前目录(包括子目录)下的所有的文件改动提交至暂存区,包括新增、修改和被删除的文件 |
git add -u. | ❌ | ✅ | ✅ | ❌ | 将当前整个工作区中被修改和被删除的文件提交至暂存区。而新文件因为未被跟踪(untracked),所以不会被提交至暂存区 |
git add * | ❌ | ✅ | ✅ | ✅ | 将当前工作区中当前目录(包括子目录)下的所有的文件改动提交至暂存区,包括新增、修改和被删除的文件,但不包括文件名以 . 符号开头的文件的改动 |
Diff
revert
与 reset
区别
revert
revert的原理是,在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化。它不会改变过去的历史,所以是首选方式,没有任何丢失代码的风险
revert
提供一种相对柔和的方式,但是如果已经提交了多次代码,想要恢复之前的状态,那么这里就需要注意在使用了revert
后需要进行工作区的代码合并和处理,避免代码的遗漏。
使用revert之前revert的commit号。一般我们在revert后会生成一个专属的revert分支,于是又新增了一个commit,把之前revert的代码又重新revert回来了。
reset
reset
的作用是当你希望提交的commit
从历史记录中完全消失就可以用
那么 reset
一般是什么时候用呢?在大多数的开发场景下,不要用,要用也是临时修改不想提交的信息,然后使用git reset --hard
命令,但是这个命令也可能会让你的一天努力白费。
展示最近提交
git show
提交Commit相关
修改提交信息
git commit --amend --only
修改最近的一次尚未push的commit信息
git commit --amend --only -m "feat(type): message"
把暂存的内容添加到上一次的提交
git commit --amend
hard reset
,如何恢复代码
意外执行了git reflog
git reset --hard SHA1234
分支Branch
删除远端分支
git push origin --delete del-branch
从错误的分支拉取了内容需要去除这部分内容
git reflog
git reset --hard HEAD
挑选部分的commit到我新的分支
git cherry-pick Head
从别人正在开发的分支迁出一个分支
git fetch -all
git checkout --track origin/daves
同步上游分支被删除的分支
git fetch -p
Rebase & Merge
已经rebase不使用--force强推代码
git rebase -i main
git checkout main
git merge --ff-only mybranch
更加复杂的操作
git rebase --interactive
组合提交内容
git rebase -i main
安全合并策略
git merge --no-ff --no-commit mybranch
Tacking File
重命名文件,修改文件大小写,希望被追踪
git mv --force myfile MyFile