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就是默认的
git checkout main # 切换回主分支
git merge <new-branch> # 合并其他分支到main
git branch -d <old-branch> # 删除已经用完的分支
git reset --hard origin/master # 直接用fetch的线上版本覆盖本地分支
git reset HEAD # 回退到上一版本
git restore --staged readme.md
git checkout -- readme.md
常用命令在这里:https://www.runoob.com/git/git-basic-operations.html
全部来自这个知乎专栏:杨世伟
默认执行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>。
假如创建了多个指向同一个仓库地址的< remote-repo-name>,实际是没什么区别的,运行git remote -v
即可看到它们的指向地址:
$ git remote -v
changed-repo [email protected]:v3/nicai001/dampc/testGitMerge (fetch)
changed-repo [email protected]:v3/nicai001/dampc/testGitMerge (push)
origin [email protected]:v3/nicai001/dampc/testGitMerge (fetch)
origin [email protected]:v3/nicai001/dampc/testGitMerge (push)
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 key之后就不用像https一样每次都输入临时密码了。
下面这篇笔记讲了如何使用SSH key :
印象笔记——dev.azure uses SSH key to git clone
git pull
和 git fetch
这两个命令都可以用于下载远端仓库。你可以认为git fetch
是这两者中更加安全的那个,即便下载了远端的内容,但也不会更新你本地仓库的版本状态,以保证你本地当前代码完好无损。反观git pull
命令则是一个更加激进的命令,它会下载当前正在工作的分支对应的远端内容,并且在下载成功之后马上执行一个git merge
命令,为新下载下来的远端内容创建一次merge commit。此时如果你有正在进行中的工作还没准备好进行合并,这些行为可能会造成代码冲突,然后马上进入合并代码过程中解决冲突的流程。
以下来自 知乎专栏——同步GIT仓库的操作 – fetch命令
git fetch <remote>
Fetch仓库中所有分支。同时也会下载指定远端的所有commits和文件。
git fetch <remote> <branch>
与上面的命令同样,但只会fetch指定分支。
git fetch --all
fetch所有已注册过的远端仓库的全部分支。
以下来自 菜鸟教程——git fetch 命令
假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行:
git fetch [alias]
以上命令告诉 Git 去获取它有你没有的数据,然后你可以执行:
git merge [alias]/[branch]
以上命令将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。
将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
$ git pull origin master:brantest
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin master
上面命令表示,取回 origin/master 分支,再与本地的 brantest 分支合并。
$ git pull origin new-branch
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
可以发现当本地新建分支并要推送的时候,必须要选择是推送哪个分支。
$ 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
CSDN博客「-FIGHTING-」
如果要合并到main分支,是这样做的
$ git checkout main
$ git merge branch01
$ git push -u origin main
用带参数的git log
也可以看到分支的合并情况
$ git log --graph --pretty=oneline --abbrev-commit
知乎 专栏 - Git——如何解决 Git 中的合并冲突?
由于new-branch是在Azure网站上在线更改的,没有本地备份,因此在fetch整个
git强制覆盖:
$ git fetch --all # 拉取所有更新,不同步
$ git reset --hard origin/master # 直接用线上版本覆盖本地分支
$ git pull # 再更新一次
第一个是:拉取所有更新,不同步;
第二个是:本地代码同步线上最新版本(会覆盖本地所有与远程仓库上同名的文件);
第三个是:再更新一次(其实也可以不用,第二步命令做过了其实)
原文链接:【git】强制覆盖本地代码(与git远程仓库保持一致)
整个过程如下:
$ git branch
branch01
* main
new-branch
$ git checkout branch01
切换到分支 'branch01'
您的分支与上游分支 'origin/branch01' 一致。
$ git checkout new-branch
切换到分支 'new-branch'
您的分支和 'origin/new-branch' 出现了偏离,
并且分别有 2 和 3 处不同的提交。
(使用 "git pull" 来合并远程分支)
$ git fetch
^C
$ git reset --hard origin/new-branch
HEAD 现在位于 accc22d Update git remote
遇到切换分支时,报错“请在切换分支/合并前提交或贮藏您的修改”,或“尚未暂存以备提交的变更”,那就是:修改了此文件并且没有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 main
error: 您对下列文件的本地修改将被检出操作覆盖:
README.md
请在切换分支前提交或贮藏您的修改。
正在终止
$ git status
位于分支 new-branch
您的分支落后 'origin/new-branch' 共 2 个提交,并且可以快进。
(使用 "git pull" 来更新您的本地分支)
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
修改: README.md
$ git restore --staged README.md
$ git status
位于分支 new-branch
您的分支落后 'origin/new-branch' 共 2 个提交,并且可以快进。
(使用 "git pull" 来更新您的本地分支)
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
修改: README.md
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
$ git checkout -- README.md
$ git status
位于分支 new-branch
您的分支落后 'origin/new-branch' 共 2 个提交,并且可以快进。
(使用 "git pull" 来更新您的本地分支)
无文件要提交,干净的工作区
命令 | 作用 |
---|---|
git diff | 工作区 vs 暂存区 |
git diff head | 工作区 vs 版本库 |
git diff --cached | 暂存区 vs 版本库 |
CSDN-DRPrincess博客: Git三大特色之Stage(暂存区)
自己的项目
git submodule add <url> path # 增加子模块
别人写的项目如果有子项目,使用者git clone
只能获取他的主程序,而没有这些submodule。如果git clone
仍然不能获取到所有内容。可以尝试
git submodule update # 如果子模块目录下是空的,这样来更新
subpath/ $ git pull # 也可以直接进入子模块目录获取这些
当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:
git submodule init
git submodule update
# 或:
git submodule update --init --recursive