常用命令:
git commit -m ""
git branch 查看本地分支
git branch -r 查看远程分支
git branch dev 创建一个新分支
git Switch (新命令,待研究)
git checkout dev 切换到新分支
git checkout -b dev 创建新分支dev 并切换到dev分支
git merge bugFix 基于当前的分支,把bugFix分支合并到当前分支(新分支有两个parent)
git rebase main 基于当前的分支,把当前分支移到main分支上(移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的)
git rebase bugFix 切换到main分支,然后把bugFix分支合并到main分支上
git checkout c1 c1为某次提交记录哈希值(不用全部,前四位即可)
git checkout main^ 切换到main分支的上一个parent
git checkout HEAD^ 后退1个parent
git checkout HEAD^^ 后退2个parent
git checkout HEAD~ 一次后退1个parent
git checkout HEAD~4 一次后退4个parent
git branch -f main HEAD~3 将main分支强制向后移动3个parent,不改变当前分支的指向
撤销:
get reset HEAD~1 通过把分支记录回退几个提交记录来实现撤销改动。(这种改写历史的方法对大家一起使用的远程分支无效)
git revert HEAD 撤销更改并分享给别人。
git cherry-pick <提交号>... 将一些提交复制到当前所在位置(HEAD)下面
git cherry-pick c2 c4 将c2和c4节点复制到当前分支上
rebase UI界面打开能做3件事
1、调整提交记录的顺序(通过鼠标拖放完成)
2、删除你不想要的提交(通过切换pick的状态来完成,关闭就意为着你不想要这个提交记录)
3、合并提交
git rebase -i HEAD~4 在当前分支UI展示最近4次提交(-i 指的是 --interactive)
场景1:你在newImage分支上进行了一次提交,然后又基于它创建了caption分支,然后又提交了一次。
此时你想对某个以前的提交记录进行一些小小的调整,比如设计师想修改一下 newImage中图片分辨率,尽管那个提交记录并不是最新的了。
解决方式如下:
1、先用 git rebase -i 将提交重新排序,然后把我们想要修改的提交记录挪到最前面。
2、然后用 git commit --amend 来进行一些小修改。
3、接着再用 git rebase -i 来将它们调回原来的顺序。
4、最后我们把main移动到修改的最前端(用自己喜欢的方式),大功告成!
git tags 标记 可以永久的将某个特定的提交命名为里程碑,然后就可以像分支一样引用。不会随着新的提交而移动。你也不能切换到某个标签上进行修改。就像提交树上的一个锚点,标识了某个特定的位置。
git tag v1 c1 给c1提交记录打上标签。如果没有指定提交记录c1,则默认HEAD所指向位置。
git describe 用来描述离你最近的锚点(也就是标签)
git describe <ref> <ref>可以是任何能被git识别成提交记录的引用,可以是分支名,如果没有指定的话,Git会使用你目前所在的位置(HEAD)
输出结果:
<tag>_<numCommits>_g<hash>
tag:表示是距离ref最近的标签。
numCommits:表示这个ref与tag相差多少个提交记录,
hash:表示的是你所给定的ref所表示的提交记录hash值的前几位。
当ref提交记录上有某个标签时,则只输出标签名称。
选择parent提交记录
^与~不一样,并不是指定向上返回几代,而是指定合并提交记录的某个 parent 提交。
git checkout main^ 回到第一个parent提交记录,指的正上方的那个parent
git checkout main^2 指的另一个parent
git checkout HEAD~ 回到上1个parent
git checkout HEAD^2 (一般有当前节点有两个parent),去到另一个parent(不是正上方的那个parent)
git checkout HEAD~2 回到上2个parent
支持链式操作:
git checkout HEAD~^2~2
git bisect (一个查找产生Bug的提交记录的指令)
undo命名是啥?
fast-forward ?
远程仓库
origin/main 本地的远程仓库
git clone 克隆远程仓库代码到本地
git fetch 向远程仓库传输数据以及从远程仓库获取数据。实际上将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态。
git fetch 不会做的事:不会改变你本地仓库的状态,不会更新你的main分支,也不会修改你磁盘上的文件。
git fetch 获得远程仓库数据,如何将这些变化更新到我们的工作中?
git cherry-pick origin/mian
git rebase origin/main
git merge origin/main
等等。。。
git pull git pull 是 gitfetch与git merge origin/main 缩写。
git pull --rebase 是 git fetch 与 git rebase origin/main的缩写。
git fakeTeamwork 模拟远程仓库提交(模拟其他人的提交记录)
git fakeTeamwork foo 3 模拟远程仓库foo分支提交了3次
git push 负责将你的变更上传到指定的远程仓库,并在远程仓库上合并你的新提交记录。
注意:git push 不带任何参数的行为与git的一个名为 push.default 的配置有关,它的默认值取决于你正使用的 git 的版本(但是在教程我们使用的是 upstream),但在真是项目推行前最好检查下这个配置。
当远程仓库基于c1变更到c2,本地仓库基于c1变更到c3,如何操作?
git fetch; git rebase origin/main;git push;
场景2:远程服务器拒绝
如果你在一个大的合作团队中工作,很可能main被锁定了,需要一些pull Request流程来合作并修改。如果你直接commit,然后试图push,你将会收到类似信息:
! [远程服务器拒绝] main -> main (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)
决绝原因:
远程服务器拒绝直接push提交到main,因为策略配置要求pull requests 来提交更新。
按照流程:新建分支-》push这个分支并申请pull request,但是你忘记并直接提交给了main。
解决办法:新建一个分支 feature,推送到远程服务器,然后reset你的main分支和远程分支保持一致,否则下次你pull并且他人的提交和你的冲突的时候会有问题。
pull requests
远程跟踪分支
方法一:
git checkout -b totallyNotMain origin/main; 创建一个名为 totallyNotMain 的分支,它跟踪远程分支 origin/main
方法二:
git branch -u origin/main foo foo会跟踪origin/main。如果当前分支为foo,可省略foo:git branch -u origin/main;
git push的参数
命令:
git push <remote> <place>
git push origin main; 意思:切到本地仓库中的main分支,获取所有提交,再到远程仓库 origin 中找到main分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我。
git push --set-upstream origin dev 本地当前分支为dev,将本地dev分支与远程分支关联;
git push origin foo^:main 将本地foo分支的上一次提交(foo^),提交到远程仓库的main分支。
git push origin main:newBranch 将本地分支main提交到远程newBranch分支(远程没有newBranch分支,会创建一个。)
git fetch 的参数
git fetch origin foo; git到远程的foo分支上,获取所有本地不存在的提交,放到本地oirgin/foo上。
git fetch origin foo~1:bar 把远程仓库上foo分支的上一个节点记录拉取到本地
git fetch oriign foo~1:bar 若执行命令时,本地没有bar分支,则会创建一个bar分支。
git push origin :foo 成功删除了远程仓库的foo(本地和远程仓库都有foo分支)分支
git fetch origin :bar 在本地新建一个bar(本地和远程仓库都没有这个分支)分支。
git pull 参数
git pull就是git fetch与git merge的缩写。
git pull origin foo 相当于 git fetch origin foo;git merge origin/foo;
git pull origin bar~1:bugFix; 相当于:git fetch origin bar~1:bugFix;git merge bugFix;
git config --global --add push.default current
该命令将 push.default 设置为 current,即默认推送与当前分支同名的远程分支。这个设置适合在本地每次创建新分支并在远程仓库中创建同名分支的情况下使用。
git config --global --add push.autoSetupRemote true
该命令将 push.autoSetupRemote 设置为 true,即 Git 会自动将本地分支与远程分支关联。这个设置可以让 Git 在推送分支时自动设置 upstream,避免了每次推送时需要手动设置 upstream 的麻烦。这个设置适合在团队推送策略是在本地创建分支后直接推送到远程的情况下使用。
git branch -d <branch-name> 删除本地分支
git push origin --delete <branch-name> 删除远程分支
缓存本地更改
git stash 暂存本地更改
git stash save '此次暂存的说明' (此处用单引号,双引号报异常)
git stash pop stash@{0} 还原最后一次暂存的更改
git stash list 查询暂存的记录
其它命令:
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 回复最后一次缓存的记录
git stash drop stash@{1} 丢弃第二次存储,从缓存列表中删除
git stash clear 删除所有缓存的stash。
场景3:加入暂存区与撤销
git add < . 或 具体文件名> :将工作区的所有文件放到暂存区(或某个文件)
git reset <具体文件名 或 空> :将缓存区的某个文件或所有文件移出到工作区,不改变工作区的其它修改。
git restore <具体文件名> :删除工作区某个文件的修改(此命令需带上具体文件路径才行)。
场景4:commit 与撤销commit
git commit -m ""
如何撤销commit操作:
git reset --soft HEAD^ 或(~1:上一次;~2:上两次)撤销commit操作,仅仅是撤销commit,不删除工作空间代码,不撤销git add .
git reset --mixed HEAD^ 或(~1:上一次;~2:上两次)不删除工作空间的改动代码,撤销commit,并且撤销git add . 操作;默认参数,同git reset HEAD^
git reset --hard HEAD^ 或(~1:上一次;~2:上两次) 删除工作空间代码改动,撤销commit,撤销git add .
场景5:撤销git push 到远程仓库操作
git reset --soft 19462f6f46cf4cbc211d366359afac0c17a7c190
git reset --hard 19462f6f46cf4cbc211d366359afac0c17a7c190
// 注意 --hard 参数会抛弃当前工作区的修改
// 使用 --soft 参数的话会回退到之前的版本,但是保留当前工作区的修改,可以重新提交
// 19462f6f46cf4cbc211d366359afac0c17a7c190 要撤销到哪个节点的hash值
git push origin main --force
场景6:git撤销pull命令
git reset --hard HEAD@{n}
git reset --hard 40a9a83
场景7:git 删除本地分支与远程分支
1、删除本地分支:(确保当前不在要删除的分支上)
git branch -d feature-branch 如果分支已经合并,用此方法;
git branch -D feature-branch 如果分支尚未合并,用此方法;
2、删除远程分支
git push origin --delete feature-branch 删除名为origin的远程仓库上的feature-branch分支;
git fetch -p 更新本地的远程跟踪分支列表,确保已删除的分支不再显示。
相关命令
git branch --merged 查看已经合并的分支
git branch --no-merged 查看尚未合并的分支
git reflog 查找该分支的最后一个提交
git checkout -b feature-branch <commit-hash> 重新创建删除的分支; commit-hash删除的分支最后一次提交hash值
场景8:git bash 解决方法 提交代码冲突处理方法
不写原因直接3,4步骤,写原因则1,2,3,4步骤
1、按键盘字母 i 进入insert模式
2、修改最上面那行黄色合并信息,可以不修改
3、按键盘左上角"Esc"
4、输入":wq",注意是冒号+wq,按回车键即可
git reflog
场景9:报错
error: You have not concluded your merge (MERGE_HEAD exists).
1
原因可能是在以前pull下来的代码自动合并失败。
解决办法一:保留本地的更改,中止合并 -> 重新合并 -> 重新拉取
$:git merge --abort
$:git reset --merge
$:git pull
解决办法二:舍弃本地代码,远端版本覆盖本地版本(慎重)
$:git fetch --all
$:git reset --hard origin/master
$:git fetch