【Git】常用命令:commit提交,push推送,merge,branch添加分支

【Git】常用命令:commit提交,push推送,merge,branch添加分支 一、常用操作0.clone仓库使用(以clone unreal的仓库为例)git clone https://github.com/EpicGames/UnrealEngine.git或git clone --depth 1 https://github.com/EpicGames/UnrealEngine.git“--depth 1”浅克隆适合clone大型仓库且你不关心历史提交时能极大的提高clone速度。但使用浅克隆的话有可能会看不到所有的远端分支即使git fetch origin之后也看不到。需要先执行git fetch --unshallow转为完整克隆然后执行git remote set-branches --add origin *映射所有分支最后git fetch origin即可。1.添加跟踪文件git add .或git add -A根据ignore的配置添加跟踪文件其中的.或-A表示添加所有更改过的文件。2.查看状态git status3.提交到本地git commit -m 说明引号内为本次提交的说明文字。如果说明文字很长需要换行则用单引号来换行如git commit -m 第一行 第二行 注意开始和结束时的两个单引号4.推送到默认分支git push如果当前分支是master则自动推送到maser分支。如果是远程分支的话此时github服务器上才是会被真正的改变。5.从远程分支合并到本地git pull当合并完后如果提示有冲突则输入mergetool beyondmerge进行冲突处理然后在push上去。6. .gitignore修改之后清除缓存使之重新生效注意前两行后面的小数点。方式一git rm -r --cached . git add . git commit -m xxxx方式二手动添加某个文件git add -f xxx\sss.txt7.彻底回退到某个commit先使用以下命令查看想回退到的commit的id是多少id就是一串长长的数字。git log然后使用注意命令中的两个“-”以下命令彻底回退到这个commitid上。git reset --hard commit_id如果想清空这个commitid之后所有已经提交了的commit则继续执行以下命令git push origin HEAD --force 注意是两个横杠8、剔除某次提交删除某次提交使用命令git revert commit-id网上说的rebase、reset之类的都不对正确的应该是用revert。使用情景已经有了多次commitmerge也属于commit但是后悔了想把其中某次commit删除掉而其后的commit不想收到影响。操作1如果要删除的这次commit属于merge分支产生的commit那么这个commitId会有两个父commitId分属于merge前的两个分支的两次提交。如图Bitbucket)此时输入git revert aacd8c89 -m 1就删除了aacd8c89这次提交并将主线设置到了798a4415这次提交上然后解决完冲突push上去就行了。如果输入git revert aacd8c89 -m 2就会将主线设置到8bd22080这次提交上然后解决完冲突push上去就行了。2如果要删除的这次commit不是有merge分支产生的那就直接输入一下命令删除本地commit就行了。git revert commit-id9. 添加submodule(子模块)(个人感觉比较鸡肋的一个功能)假如又以下的实际场景某个工作中的项目需要包含并使用另一个项目。 现在问题来了你想要把它们当做两个独立的仓库同时又想在一个项目中使用另 一个。Git 通过子模块来解决这个问题。 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一 个仓库克隆到自己的项目中同时还保持提交的独立。9.1 在已经项目父仓库中添加子模块git submodule add https://github.com/xxx/abc.git此时在当前文件夹下就创建了一个名为abc的文件夹此文件夹里就是abc.git这个仓库里的所有文件。9.2 clone父仓库的代码由于父仓库里现在已经添加了子模块所以不能像之前简单clone的方式来操作了需要添加几个参数git clone --recurse-submodules这样clone时就会连同子模块一起clone下来不管父仓库里有多少submodule不管submodule里还有没有submodule都会被clone下来。如果clone时忘记了添加了--recurse-submodules参数或者另外一位同事需要获取你配置的子模块则执行以下命令即可git submodule update --init --recursive10. 修改commit信息git commit --amend或git commit --amend -m new commit message适用于修改最近一次的commit的commit message修改历史commit信息参考https://blog.csdn.net/Muscleape/article/details/10563740111. 将多个commit合并为1个合并commit这里就以sourcetree的操作举例假如我们需要将BCD三次提交合并为一次提交其操作步骤如下首先在A提交上右键选择“【Rebase children of xxx interactively】”如下图然后选中第一项即D提交然后一直点击【Squash with previous】如下图点完之后如下图可以看到3次提交被折叠到了一组同时勾选上Amend Commit表示要修改commit 信息然后点击上图【EditMessage】按钮填写本次squash的信息如下图继续点击OK此时我们会发现本地的test和origin/test位于不同的提交上如下图此时使用git push --force命令强制将本地推上去即可。推完之后如下图完美合并。12. rebase操作变基详见【Git】如何使用sourcetree进行rebase操作变基13. 移除所有更改 (discard all changes)git restore .14. 创建ssh key除了使用https clone仓库之外还可以使用ssh key clone。 key一旦创建之后不会因你修改了github的用户密码而失效。而且key只要你不共享一直存在你自己的电脑上避免使用密码暴露的风险。14.1 使用命令行生成秘钥ssh-keygen -t ed25519 -C MiyaoGithub当提示类似“Enter file in which to save the key (/home/user/.ssh/id_ed25519):”时输入一个文件路径比如E:\somefolder\MiyaoGithubsomefolder要自己提前创建好命令行不会自动创建。“MiyaoGithub”是秘钥的名字不是文件夹的名字不需要自己手动创建。回车之后会自动生成两个文件“MiyaoGithub”和“MiyaoGithub.pub”其中pub文件就是公钥用记事本打开之后复制全部内容粘贴到github上14.2 配置本地git执行命令ssh-agent -s如果报错则参考https://blog.csdn.net/weixin_39370315/article/details/133440677解决。然后打开你的.ssh目录windows下一般为“C:/User/用户名/.ssh”linux下一般为“~/.ssh”创建一个名为config的文件添加以下内容# Private GitLab instance Host github.com PreferredAuthentications publickey IdentityFile E:\somefolder\MiyaoGithubHost就是对应的git仓库域名如果你部署有自己私有的git仓库可以改为你自己的网址。IdentityFile就是我们前面创建的秘钥文件。15. 移除所有不被git跟踪的文件或文件夹git clean -ndx # 先预览包含 ignored 的文件 git clean -fdx # 确认后执行二、分支操作1.查看所有分支用命令git branch -a$ git branch -a * gym master remotes/origin/HEAD - origin/master remotes/origin/gym remotes/origin/master结果里一共5个分支带remotes的是远程分支不带的是本地分支。前面带*号的表现当前所处的分支。master就是主分支当你从github上clone下之后默认就是clone的主分支(master)。那么那个origin是什么意思呢你可以把他理解为你仓库的网址如https//www.xxxx.com/123.git。2.创建新分支命令git branch test。将会创建一个名为test的新分支然后再次查看所有分支git branch -a * gym master test remotes/origin/HEAD - origin/master remotes/origin/gym remotes/origin/master可以看到已经有了新分支test。接下来再把新分支推送到远程分支github仓库上$ git push origin test然后再查看所有分支$ git branch -a * gym master test remotes/origin/HEAD - origin/master remotes/origin/gym remotes/origin/master remotes/origin/test可以看到remotes中又多了一个远程test分支。3.切换分支$ git checkout test然后再次查看所有分支你就会 发现这次*号在test分支上面。如果以后在pushpull的时候就想用这个分支了不用master分支了就继续输入$ git push --set-upstream origin test将pull push等操作的默认分支设为test否则以后pull push的时候每次都要指定哪个分支。4.删除本地分支test$ git branch -d test 已删除分支 test曾为 eef866f。再次查看所有分支$ git branch -a * gym master remotes/origin/HEAD - origin/master remotes/origin/gym remotes/origin/master remotes/origin/test发现本地test分支已经没有了。5.删除远程分支删除完本地就应该删除远程了。输入以下命令$ git branch -r -d origin/test 已删除远程分支 origin/test曾为 eef866f。然后在输入$ git push origin --delete test才是真正的删除远程分支。6.合并分支如果我们想把test分支合并到master分支中该怎么弄呢首先先切换到master分支然后执行git merge test7.冲突合并git mergetool然后输入需要自己提前安装beyond compare这个软件beyond compare3. 仓库操作3.1 清理旧的提交释放git仓库空间git checkout --orphan tmpmaster //创建临时分支tmpmaster git add . //添加要跟踪的文件 git commit -m clean branch master //提交 git branch -D master //删除本地的master分支 git branch -m master //把当前分支重命名为master git push -f origin master //用本地的master覆盖远端的master写在最后如果大家实在记不住这些复杂的命令可以使用Git可视化工具这里推荐两个1. Sourcetree笔者之前使用但产品不太稳定有些bug和操作很难受。2. Fork现在的主力快不卡顿。