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

revertreset区别

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

参考