git实战经验

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值