1. git pull --rebase
使用场景:提交代码时提示远程代码已经更新时,可以使用该命令
原因分析:本地分支和对应的远程分支发生了分叉;
本地分支基于某个基底(如commitA)的。但在远程对应分支上,在CommitA后面已经附加了新的commit。远程对应分支上最新的commit是CommitB。
效果:改变本地分支的基底,变成远程对应分支上最新的Commit。成功rebase后,本次分支就是基于程对应分支上最新Commit,就可以顺利git push了。
git push的一个前提条件是所有commit都是线性的,不能出现分叉。
效果等价与:git rebase origin/[BranchName]
2.git checkout带b和不带b的区别
git checkout -b [BranchName] 创建新的分支,分支的内容即当前工作区的内容
git checkout [BranchName] 切换到已经存在的分支
3.使用git base重新编辑提交历史
使用场景:写了一点代码就commit。当某个任务开发完成后需要push时,发现提交了很多commit,看起来比较乱。为了让团队内其他人更容易理解,为了git log更清晰,可以在push前,对commit提交历史进行编辑。如将多个commit合并成一个
使用方法:git rebase -i BeginCommit [EndCommit] 重新编辑[BeginCommit, EndCommit)区间内的commit历史
4.使用git rebase改变分支的基底
使用场景:应尽可能使commit提交历史保持线性的。但多人协作时不可避免会让commit历史产生分叉。这时就可以使用git rebase, 改变分支的基底,即所谓rebase.
使用方法: git rebase b1 [b2] 将b2分支的基底修改为b1分支的最新commit。b2可省略,省略时修改当前分支的基底。
修改基底时可能会产生冲突。
如果有冲突,先修改冲突文件(会有提示,或者使用git status查看)。冲突文件修改完成后,执行命令git rebase --continue.
如果冲突后想放弃本次rebase操作,执行命令git rebase --abort
5.git重要概念:History, Stage(Index), Working Directory
文件比较:
git diff a.txt #比较work directory 与stage
git diff --cache a.txt #比较stage与histroy
git diff HEAD a.txt #比较work dirctory 与history
文件恢复:
git checkout -- <file> 使用暂存区的file文件替换工作区的file文件。如果工作区和暂存区的文件内容不一致,则会丢弃discard工作区的内容;
git reset [--soft, --mixed, --hard] [HEAD, commit id, branch name]
git reset用于版本恢复。具体来说,是将当前的commit指针恢复到第二个参数上,同时根据第一个参数,恢复暂存区或者工作区,以使暂存区或工作区与当前的commit指针匹配。
如果第一个参数是--soft,仅仅恢复当前的commit指针,不改变暂存区和工作区。
如果第一个参数是--mixed(默认值),除恢复当前的commit指针外,恢复暂存区,以使暂存区与当前的commit指针匹配。工作区的内容不改变。
如果第一个参数是--hard,除恢复当前的commit指针外,恢复暂存区和工作区,以使暂存区和工作区与当前的commit指针匹配。如果工作区有未提交的修改,这些修改将会被丢失。所以git reset --hard是危险操作。
使用场景举例:修改了A.cpp和B.cpp,git add A.cpp B.cpp后后悔了,不想在本次提交A.cpp文件的修改。使用git reset HEAD A.cpp, 则可以将A.cpp的修改从暂存区拿出来。
6.git重要概念:commit, HEAD, refs, branch
git仓库是由一次次的commit组成。commit的延展一般是线性的。每次提交都是基于最新的commit进行的。最新的commit就像是commit延展的引导者(或者说是头)。
当仓库有多个分支时,commit就有多个延展方向,每个延展方向的引导者就是branch。所以说branch实质是某个commit。
当仓库有多个分支时,即有commit有个延展方向时,当前的延展方向是什么了?这就是HEAD。HEAD指向
7.--depth 1
完整的命令形如:
git clone https://github.com/xxx/xxx.git --depth 1
depth参数的作用:仅下载最新的代码,不下载代码修改的历史。这样做需要下载的内容就会少很多,加快代码下载时间。如果需要下载的代码库很大,或者网络不好,或者是只需要最新的代码(如每日构建), 就可以在clone时加上depth参数。
通过--depth 1参数clone下来的代码只有1条代码提交记录。那么我们要如何把之前的历史重新再 pull 下来呢?可以通过下面的命令:
git fetch --unshallow
8.submodule
submodule用于管理项目中的第三方代码库。
submodule本质上就是一个标准的Git repository。使Git repository成为submodule的唯一原因是它被放在了另一个父Git repository中。
添加一个Submodule:
git submodule add -b <branch> https://github.com/xxx.git ./third_party
当我们执行该命令后,git就会将xxx.git代码的branch分支clone到third_party目录下,同时还在主项目的根文件夹中创建了一个新的.gitmodules
文件。该文件记录了主项目中所有的submodule及其详细信息。
git需要管理submodule的如下信息:submodule的rul路径,在主项目中的路径,主项目中采用的版本号。
添加submodule,修改submodule的版本号,修改submodule在主项目中的路径,删除submodule等都会可以成为1个commit。
如何clone带有submodule的项目?
#方法1
git clone https://github.com/xxx.git
git submodule update --init --recursive
#方法2
git clone https://github.com/xxx.git --recurse-submodules
9.tag
查看分支: git tag
获取tag详情(git show <tag>), 找出打 tag 时对应的commit id
切换到打tag时的commit id:
git reset --hard <commit>
本地生成tag: git tag <tag>
本地tag推送到远程仓库: git push origin <tag>
10.git status中文路径显示为乱码(实际上是十六进制表示)
git config --global core.quotepath false
执行完这个命令,git就不会对路径进行转换,显示原来完整的中文路径。
11.将commit id作为版本号用于版本构建
git rev-parse HEAD
git rev-parse --branches master
git rev-parse --tags v1.9.0
import os,subprocess
def get_sha(pytorch_root: Union[str, Path]) -> str:
try:
return (
subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=pytorch_root)
.decode("ascii")
.strip()
)
except Exception:
return UNKNOWN
def get_torch_version(sha: Optional[str] = None) -> str:
pytorch_root = Path(__file__).parent.parent
version = open(pytorch_root / "version.txt", "r").read().strip()
if os.getenv("PYTORCH_BUILD_VERSION"):
assert os.getenv("PYTORCH_BUILD_NUMBER") is not None
build_number = int(os.getenv("PYTORCH_BUILD_NUMBER", ""))
version = os.getenv("PYTORCH_BUILD_VERSION", "")
if build_number > 1:
version += ".post" + str(build_number)
elif sha != UNKNOWN:
if sha is None:
sha = get_sha(pytorch_root)
version += "+git" + sha[:7]
return version
if __name__ == "__main__":
sha = get_sha(pytorch_root)
version = get_torch_version(sha)