搞乱了强制恢复:
git checkout master # 切换到本地的master分支
git fetch upstream master
git reset --hard f2eac5df1840b65b24 # 将本地分支强制设到upstream/master的自己改动之前的那个分支
git rebase upstream/master
git branch -D dev5 # 强制删除本地dev5分支
git checkout -b dev5 --track master # 新建一个分支(也许不需要--track master更好!)
git branch --unset-upstream (估计是取消和master的关系)
git push -f --set-upstream origin dev5 # 和远程dev5建立关系,推到远程;
查看本地所对应的远程URL:
git config --get remote.origin.url
git remote -v 更好使
查看本地分支对应的远程分支:
git branch -vv
将本地分支推送到远程分支并建立对应关系:
git push --set-upstream remote_repo_name branch_name
当我想从远程仓库里拉取一条本地不存在的分支时:(先用git config --get remote.origin.url确认origin是不是自己想要的)
git checkout -b 本地分支名 origin/远程分支名
和上游分支建立联系:
git branch --set-upstream-to=origin/master
git fetch upstream master
git rebase upstream/master
loop:
<Update local files>
git add .
git rebase --continue
git push origin dev5 -f
首先clone fork出来的仓库到本地
git clone git@github.com:123/456.git
在 fork 的代码库中添加上游代码库的 remote 源
git remote add upstream git@github.com:789/456.git
获取原始仓库分支和对应的提交
git fetch upstream master
在本地实现与upstream的同步(之前一定要先checkout到{branch name}所指定的branch)
git rebase upstream/master
解决冲突:
loop:
<Update local files>
git add .
git rebase --continue
推送自己的本地仓库到自己的远程仓库
git push -f
合并PR里的多个commit: (git rebase -i <earliest-commit-version>)
git push -f
cherry-pick:
拉取要往上merge的upstream分支(一般是upstream/master),切换到上面
git checkout -b <name> 建立本地分支 (此时此新分支和upstream/master完全一致)
git fetch XXX branch_name 从远端拉取包含要cherry pick的commits们的分支;
git cherry-pick commit_id(即那个commit的hash id)
也可重复上面的cherry-pick多次,提交多个commit_id
git push到自己的远程分支
提交PR到upstream/master
注意:如果分成多次PR来提交,这些PR之间可能会有冲突,人家老大们merge的时候就要很麻烦的解决冲突;保险起见全部放到1个PR里最为稳妥;
带third-party等子目录的PR提交:
先找到子目录对应的项目A,fork一个自己的repo,将这部分改动提交PR到子项目A
使用git submodule update命令,提交一个PR到主项目B上,merge后,会发现主项目的子目录后面的hash码变成了自己提交后那个hash码;
进行主项目部分的代码改动,提交PR至主项目;
git submodule的原理:链接; 更清晰的版本,先第3步拉取远程子项目,再用commit/push更新主目录的记录;
其实就是:
1. 先独立更新子项目并commit、push;提交这个PR到源头子项目;
2. 在父项目的子项目目录里,git fetch远程master,并checkout到master;
3. 在父项目的根目录里,用git diff可以看到子项目的commit-id发生了变化;使用git add和git commit和git push将子目录提交;提交这个PR到源头父项目;
4. 独立更新父项目并commit、push;提交这个PR到源头父项目;
其中3和4的PR,可以并行提交上去;
带third-party等子目录的PR运行CI:
主项目里:
git submodule update
修改.gitmodules里的子项目对应的URL
git submodule sync
子项目里(pytorch/third_party/kineto):
git pull
git checkout 要修改的分支
cd至pytorch/third_party:
git add -u
git diff --cached (可以看到加进去了)
cd至主项目目录:
git commit
git push
Git回滚代码到某个commit
回退命令:
$ git reset --hard HEAD^ 回退到上个版本
$ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前
$ git reset --hard commit_id 退到/进到 指定commit的sha码强推到远程:
$ git push origin HEAD --force
================================================
1. #git log //找到需要回滚的commit-id,或者在gitlab上查看也可以
2.#git reset –hard (commit-id) //回退到某次commit
3.#git push -f origin ( branch-name ) //强制推送到分支上
完工,然后到gitlab上去查看相应的分支是否回退了
回退到之前的一个commit
git reset --hard <commitID>
git fetch --all
git reset --hard origin/master
git pull
git fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEAD指向刚刚下载的最新的版本
和git pull等价的命令:
git fetch 命令:
$ git fetch <远程主机名> //这个命令将某个远程主机的更新全部取回本地
- 如果只想取回特定分支的更新,可以指定分支名:
$ git fetch <远程主机名> <分支名> //注意之间有空格
- 最常见的命令如取回
origin
主机的master
分支:$ git fetch origin master
- 取回更新后,会返回一个
FETCH_HEAD
,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:$ git log -p FETCH_HEAD
我们可以通过这些信息来判断是否产生冲突,以确定是否将更新merge到当前分支。
git merge FETCH_HEAD //将拉取下来的最新内容合并到当前所在的分支中
merge完,用git add和git commit和git push提交到远程;
比较2个brach的差异:
git diff dedup..upstream/master
在github上比较2个commit的差异:(前面405e092是基准版本)
https://github.com/my_git_name/my_repo_name/compare/405e092..d93b3f8
跨越repo的比较:Comparing commits - GitHub Docs
- 工作目录 Working Directory :对项目的某个版本独立提取出来的内容,这些从Git仓库的压缩数据库提取出来的文件,放在磁盘上供你使用或修改。
- 暂存区域 Staging Area :是一个文件,保存了下次将提交的文件列表,是待提交文件的暂存区域。一般在Git仓库的目录中,有时也被称为索引。
- 本地Git仓库
- 远程Git仓库
Git常用命令及方法大全(分支管理策略)
只拉取部分repo的方法
参考资料:Git sparse-checkout 检出指定目录或文件 - Pekkle - 博客园
Git sparse-checkout 检出指定目录或文件_java爱好者的博客-CSDN博客
# 初始化git仓库并进入
git init planning
cd planning
# 允许sparse checkout
git config core.sparsecheckout true
# 只checkout planning文件夹
echo planning >> .git/info/sparse-checkout
# 设置远程仓库地址并拉取
git remote add origin https://xiaobingai@dev.azure.com/xiaobingai/TopSearch/_git/TopSearch
git pull origin master
只clone一层(不包换历史commit),只克隆master:
git clone --depth 1 --branch master https://XXX
另一种拉取远程分支的方法:
git pull origin gaoteng/branch_A:gaoteng/branch_A
然后手动git checkout gaoteng/branch_A
只比较一个文件:
git diff gaoteng/add-profiling~0:live-backend/util/profiler.py util/profiler.py
前面是分支里的文件,后者是当前目录里的文件;