常用命令
git clone <repo-url> # 拷贝项目到本地
git branch <new-branch> # 创建新分支
git checkout <new-branch> # 切换到新分支
git checkout -b <new-branch> # 创建并切换到新分支
git fetch <repo-name> <branch-01> # 从远程获取repo
git pull <repo-name> <remote-branch>:<local-branch> # 获取远程remote分支,合并到本地local分支
git pull # 获取并合并到本地当前分支
git add . # 添加全部改动
git commit -m "msg" # 提交当前分支到本地
git push <repo-name> <local-branch>:<remote-branch> # 提交本地更改到远程
git push origin <new-branch># 提交新的本地分支,这里的origin就是默认的<repo-name>
git checkout main # 切换回主分支
git merge <new-branch> # 合并其他分支<new-branch>到main
git branch -d <old-branch> # 删除已经用完的分支<old-branch>
git reset --hard origin/master # 直接用fetch的线上版本覆盖本地分支
git reset HEAD # 回退到上一版本
git restore --staged readme.md
git checkout -- readme.md
git checkout 07ed0f4 src/main.cpp # 回退文件到特定版本
常用命令在这里:https://www.runoob.com/git/git-basic-operations.html
fetch and remote
全部来自这个知乎专栏:杨世伟
远程repo
git remote -v(这个命令没什么用)
默认执行git remote命令后会列出之前设置过的所有远端仓库的别名
$ git remote
展示当前关联的其他仓库列表
$ git remote -v
与上面的命令一样,但是输出会包含每一个仓库的URL.
$ git remote add <repo-name> <repo-url>
上面的命令创建了一个与远端仓库的关联关系。在此之后,你就可以使用作为这个仓库的别名在其他git命令中使用。
$ git remote rm <name>
删除别名为的远端仓库的关联关系。
$ git remote rename <old-name> <new-name>
将别名为< old-name>的远端仓库的关联关系重命名为< new-name>。
HTTP 还是 SSH
Git支持通过很多方式来访问远端仓库。其中最简单的两种方式是通过HTTP和SSH协议。HTTP协议通常用于允许匿名只读访问仓库。比如:
http://host/path/to/repo.git
但是,通常来说通过HTTP地址的访问都无法进行push操作(应该不会有人愿意让匿名用户进行push操作)。对于可读可写的操作,应该使用SSH协议:
ssh://user@host/path/to/repo.git
通过SSH协议访问时,Git托管主机上应该有你的一个合法SSH账号,除此之外你无需进行其他任何配置,Git的具名SSH访问能力是开箱即用的。通常第三方托管平台,会提供你的Git项目的URL。
SSH如何使用
实测还是ssh好用
一旦生成ssh key之后就不用像https一样每次都输入临时密码了。
下面这篇笔记讲了如何使用SSH key :
印象笔记——dev.azure uses SSH key to git clone
git pull=git fetch+git merge
git fetch
git pull
和 git fetch
这两个命令都可以用于下载远端仓库。你可以认为git fetch
是这两者中更加安全的那个,即便下载了远端的内容,但也不会更新你本地仓库的版本状态,以保证你本地当前代码完好无损。反观git pull
命令则是一个更加激进的命令,它会下载当前正在工作的分支对应的远端内容,并且在下载成功之后马上执行一个git merge
命令,为新下载下来的远端内容创建一次merge commit。此时如果你有正在进行中的工作还没准备好进行合并,这些行为可能会造成代码冲突,然后马上进入合并代码过程中解决冲突的流程。
获取远程分支1
以下来自 知乎专栏——同步GIT仓库的操作 – fetch命令
git fetch <remote>
Fetch仓库中所有分支。同时也会下载指定远端的所有commits和文件。
git fetch <remote> <branch>
与上面的命令同样,但只会fetch指定分支。
git fetch --all
fetch所有已注册过的远端仓库的全部分支。
获取远程分支2
以下来自 菜鸟教程——git fetch 命令
假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行:
git fetch [alias]
以上命令告诉 Git 去获取它有你没有的数据,然后你可以执行:
git merge [alias]/[branch]
以上命令将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。
git pull origin remote-branch01:local-branch01
将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
$ git pull origin master:brantest
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin master
上面命令表示,取回 origin/master 分支,再与本地的 brantest 分支合并。
$ git pull origin new-branch
branch and merge
使用分支
git branch
命令允许对分支进行创建、列举、重命名以及删除的操作。它不能进行切换分支或者将分叉的commit记录扔到其他分支里。因此git branch
总是与git checkout
以及git merge
命令共同出现在使用场景中。
$ git branch <branch-name>
创建一个名为 的分支。但此命令并不会自动检出新创建的分支。
$ git branch -d <branch-name>
删除指定分支。这是一个安全的操作,因为当分支中含有未合并的变更时,Git会阻止这一次删除操作。
$ git branch -m <branch-name>
对于当前分支重命名为。
本地创建并使用分支
$ git branch branch01 # 创建新分支
$ git checkout branch01 # 选择所创建的分支
查看一下现在的分支状态:
$ git branch
* branch01
master
release
星号(*)表示当前所在分支。现在的状态是成功创建的新的分支并且已经切换到新分支上。创建并选择分支合并为一句:
git checkout -b branch01
要注意此时你只是创建
了这个分支。如需开始对新分支进行提交,要先选择这个新的分支,使用git checkout
命令,然后再使用标准流程git add
、git commit
等命令。
本地分支与远端的联系尽量一致,如果本地相较于远程多出来的,可以删除。
$ git remote rm branch01
过程如下:
$ git checkout branch01
M README.md
切换到分支 'branch01'
$ git add .
$ git commit -m "git branch"
[branch01 9296183] git branch
1 file changed, 3 insertions(+), 1 deletion(-)
$ git push
fatal: 当前分支 branch01 没有对应的上游分支。
为推送当前分支并建立与远程上游的跟踪,使用 git push --set-upstream origin branch01
可以发现当本地新建分支并要推送的时候,必须要选择是推送哪个分支。
将本地branch提交
$ git push <remote-repo-name> local-new-branch:remote-new-branch# 当地新分支提交到remote origin的新分支
以上命令先添加了远程仓库,然后将本地分支branch01
推向远程,如果仓库里没有这一分支,就创建同名的分支。
实际情况没有这么复杂。假如我们实在一个repo上改动,那是不变的,也就是origin。远程分支与本地分支同名
$ git push origin branch01 # 当地分支提交到远程仓库
使用
git branch -a
查看所有分支,会看到
remotes/origin/dbg_lichen_star
这个远程分支,说明新建远程分支成功。
删除远程分支
我比较喜欢的简单方式,推送一个空分支到远程分支,其实就相当于删除远程分支:
$ git push origin :dbg_lichen_star
也可以使用:
$ git push origin --delete dbg_lichen_star
合并
merge
如果要合并到main分支,是这样做的
$ git checkout main
$ git merge branch01
$ git push -u origin main
用带参数的git log
也可以看到分支的合并情况
$ git log --graph --pretty=oneline --abbrev-commit
![](https://i-blog.csdnimg.cn/blog_migrate/aa72c79b24c7158106208cf0e8dd6c7f.png)
git reset 强制覆盖本地代码
由于new-branch是在Azure网站上在线更改的,没有本地备份,因此在fetch整个
git强制覆盖:
$ git fetch --all # 拉取所有更新,不同步
$ git reset --hard origin/master # 直接用线上版本覆盖本地分支
$ git pull # 再更新一次
第一个是:拉取所有更新,不同步;
第二个是:本地代码同步线上最新版本(会覆盖本地所有与远程仓库上同名的文件);
第三个是:再更新一次(其实也可以不用,第二步命令做过了其实)
原文链接:【git】强制覆盖本地代码(与git远程仓库保持一致)
全部恢复至某个历史版本
git reset --hard 历史版本号b1c
git push -f origin master # 强制推送
撤回更改
舍弃更改
遇到切换分支时,报错“请在切换分支/合并前提交或贮藏您的修改”,或“尚未暂存以备提交的变更”,那就是:修改了此文件并且没有add和commit.然后你在branch、pull时就会出现此提示。参考:git pull时:对下列文件的本地修改将被合并操作覆盖
$ git restore --staged README.md
$ git checkout -- README.md
执行commit后,还没执行push时,想要撤销这次的commit,该怎么办?
git reset --soft HEAD^
这样就成功撤销了commit,如果想要连着add也撤销的话,–soft改为–hard(删除工作空间的改动代码)。
另外一点,如果commit注释写错了,先要改一下注释,有其他方法也能实现,如:
git commit --amend
这时候会进入vim编辑器,修改完成你要的注释后保存即可。
回滚部分文件到某个版本
还原单个文件
git checkout 07ed0f4a1b9118124df26d62ffa8c253ec540207 src/main.cpp
还原文件夹,使用相对路径(相对路径最开始不能有斜杠)
git checkout 07ed0f4a1b9118124df26d62ffa8c253ec540207 src/
上面的相对路径是相对运行bash命令的路径,而不是相对项目根目录的。
git 各类撤销命令
1.git add 后撤销:
撤销所有add文件
git reset HEAD .
撤销单个add文件
git reset HEAD -filename
2.git commit 后撤销:
只回退commit的信息,保留修改代码:
git reset --soft head
彻底回退到上次commit版本,不保留修改代码:
git reset --hard head^
说明:
HEAD :当前版本
HEAD^ :上一个版本
–hard 参数会抛弃当前工作区的修改
–soft 参数的话会回退到之前的版本,但是保留当前工作区的修改,可以重新提交
3.撤销所有本地改动代码:
git checkout .
4.本地代码回退到与git远程仓库保持一致
git reset --hard 远程分支名
5.git push撤销:
回滚此次push到服务器的代码:
git log #查看commit的信息
git revert 以前commit的id
此时本地回滚的代码到服务器就可以了
6.git merge 撤销:
git checkout 【行merge操作时所在的分支】
git reset --hard 【merge前的版本号】
git 去除指定文件、文件夹版本控制
git rm -r -f build # build为所要放弃的文件夹
查看本地与remote的异同
命令 | 作用 |
---|---|
git diff | 工作区 vs 暂存区 |
git diff head | 工作区 vs 版本库 |
git diff --cached | 暂存区 vs 版本库 |
CSDN-DRPrincess博客: Git三大特色之Stage(暂存区)
submodule
自己的项目添加子模块
git submodule add <url> path # 增加子模块
拷贝的项目带有子模块需要进入目录更新
别人写的项目如果有子项目,使用者git clone
只能获取他的主程序,而没有这些submodule。如果git clone <repo-url> --recursive
仍然不能获取到所有内容。可以尝试
git submodule update # 如果子模块目录下是空的,这样来更新
subpath/ $ git pull # 也可以直接进入子模块目录获取这些
当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,文件夹是空的。此时,只需执行如下命令:
git submodule init
git submodule update
# 或:
git submodule update --init --recursive
完整拷贝带有子模块的项目
git pull --recurse-submodules # update recursively all the submodules