• git 备忘录


    git 备忘录

    目录

    0. 本文目的

    公司里用svn管理代码,但在个人开发机上管理代码用git更方便,因为:1)本地就可以执行commit/checkout,不需要连到服务器;2)我的代码修改版本太多,主要给自己看。

    主要是在Git Bash中敲基本的git命令,辅助一些GUI工具,因为:1)Git Bash能正确显示中文,cmd不能; 2)比较目录等情况下,GUI软件效率高。

    1. git使用GUI比较程序

    一个典型的问题是:如何比较两次git commit / 两个branch 下的整个repo?

    配置

    • 需要安装比较工具,我用的是Beyond Compare4。在没有使用git的时候,Beyond Compare的易用性也让我在不同版本代码的比较和合并中颇有收益。

    • 还需要在git中配置Beyond Compare

    Beyond Compare 4注册码:

    w4G-in5u3SH75RoB3VZIX8htiZgw4ELilwvPcHAIQWfwfXv5n0IHDp5hv
    1BM3+H1XygMtiE0-JBgacjE9tz33sIh542EmsGs1yg638UxVfmWqNLqu-
    Zw91XxNEiZF7DC7-iV1XbSfsgxI8Tvqr-ZMTxlGCJU+2YLveAc-YXs8ci
    RTtssts7leEbJ979H5v+G0sw-FwP9bjvE4GCJ8oj+jtlp7wFmpVdzovEh
    v5Vg3dMqhqTiQHKfmHjYbb0o5OUxq0jOWxg5NKim9dhCVF+avO6mDeRNc
    OYpl7BatIcd6tsiwdhHKRnyGshyVEjSgRCRY11IgyvdRPnbW8UOVULuTE
    
    • Beyond Compare提示到期
      如果Beyond Compare提示评估到期,卸载、删注册表、重装后,还是提示评估到期,那么:
      修改C:Program FilesBeyond Compare 4BCUnrar.dll ,这个文件重命名或者直接删除

    在Git Bash中编辑~/.gitconfig,确保有如下字段:

    [diff]
            tool = bc4
    [difftool "bc4"]
        cmd = ""D:\soft\Beyond Compare 4\BCompare.exe" "$LOCAL" "$REMOTE""
    [merge]
            tool = bc4
    [mergetool "bc4"]
        cmd = ""D:\soft\Beyond Compare 4\BCompare.exe" "$LOCAL" "$REMOTE""
    

    注意其中Beyond Compare的路径写法,反斜杠、引号都不能少;并且应该使用cmd而不是path

    使用

    比较两次commit:

    git difftool commit_id1 commit_id2 -d
    

    其中-d表示以目录形式比较,而不是默认的“逐文件比较”。

    比较两个分支,例如master和develop分支:

    git difftool origin/master origin/develop -d
    

    2. git中文件的几种状态

    在执行git add后,在修改文件后,在git commit后,使用git status查看状态,感觉有点晕,于是仔细研究下git的状态:

    针对单个文件,可以粗略分成2个大的状态:

    • untracked,也就是没有被git跟踪,只要文件存在,并且没有被git add过,就是untracked状态
    • tracked,被git跟踪,只要被git add过(并且没有被git remove过),就是tracked状态。它可以进一步细分:
      • unmodified,没有修改,是一个文件指被git add和git commit过,而当前working area中的该文件与commit时一致
      • (not staged) modified,命令行下显示为红色,是指文件被git commit过,并且现在在工作区被修改了,但是没有通过git add放到staging area(暂存区)
      • modified,命令行下显示为绿色,是指文件有被git commit过,现在在工作区被修改了,并且也被git add了,但是没有被git commit过
      • new file,命令行下显示为绿色,是指文件第一次被git add(而处于staging area),而没有被git commit

    相应的,对于整个工程的文件,有3个区域:

    git diff和git diff --cached

    输入git diff,查看到的是工作区和暂存区的不同

    输入git diff --cached,查看到的是暂存区和HEAD的不同。

    如下测试可以验证:

    mkdir -p /tmp/git-demo
    cd /tmp/git-demo
    git init .
    echo "#include <stdio.h>" >> main.c
    echo "this is the readme" >> readme.md
    git add .
    git commit -m "first commit"
    echo "int main(){printf("hello
    "); return 0;}" >> main.c
    echo "add a new line" >> readme.md
    git add main.c
    git diff
    git diff --cached
    

    也即:首先把main.c和readme.md执行git add和git commit;然后分别修改main.c和readme.md,但是只git add main.c;这时候git diff只能看到readme.md的不同,是working area和stage的比较;此时输入git diff --cached只能看到main.c的不同,是stage和HEAD的比较。

    git difftool和git mergetool

    但凡用到git diff的地方,包括git diff本身,以及带的其他参数例如git diff --cached,都可以把diff换成difftool,这样的话就会使用在~/.gitconfig中配置的diff的图形界面工具来执行比较。e.g.:

    git difftool -y
    git difftool --cached -y
    

    其中-y表示yes,不要询问我是否用我配置的GUI工具(例如beyond compare)来打开,直接打开就是了。

    类似的,git merge也有对应的git mergetool,只要先前在~/.gitconfig中配置过mergetool即可。实际上,beyond compare也可以做mergetool,我的difftool和mergetool都是它。

    查看版本差异/版本回退/撤销回退

    这里考虑的是整个工程的所有代码文件。

    例如有3次commit,现在(在commit_id3的基础上,有代码修改!)突然发现代码有bug,而第二次的commit当时测试是没有bug的,那么我最新一次(第三次)commit中肯定是写了bug的,就希望从这次commit中新增的代码中找出来。

    此时,如果要回退版本,因为working area有代码没有commit,应当add并commit,否则reset后回不来

    此时有三种选择:

    • 查看两个版本之间的差异:
      git difftool -y commit_id2 commit_id3
    • 把working area,(从commit_id3)切换回commit_id2,并且保证以后能再切换回commit_id3
      git reset --hard commit_id2
    • commit_id2切换回commit_id3
      先使用git reflog查看得到commit_id2的值,然后git reset --hard commit_id3

    3. 单个文件撤销工作区修改

    git checkout -- filename

    4. 查看远端(remote)地址

    有时候在同一目录下,git clone了好几份类似的代码,为了区分它们,可以把它们的下载地址放在一个readme.txt中,但是仍然不方便。

    简单方便的方法是:进入各自repo的目录,查看remote:

    cd hed
    git remote origin show
    

    其中origin是默认的远端名字,就像master是默认的分支一样。结果如下:

    ⚡ git remote show origin 
    * remote origin
      Fetch URL: https://github.com/zeakey/hed
      Push  URL: https://github.com/zeakey/hed
      HEAD branch: master
      Remote branch:
        master tracked
      Local branch configured for 'git pull':
        master merges with remote master
      Local ref configured for 'git push':
        master pushes to master (up to date)
    

    5. 删除untracked状态的文件、目录

    • 删除单个untracked状态的文件
    git clean -f  xxx
    

    其中-f表示force,强制删除。因为git的配置中clean.requireForce默认为true,所以必须加-f才能正常执行清除(个人猜测:用来防止小白误删文件)

    • 删除所有untracked状态的文件
    git clean -f
    
    • 删除所有untracked状态的文件、目录
    git clean -df
    

    6. 从本地文件系统的仓库中clone

    情景:项目中用到一个开源项目(比如opencv),它的代码仓库比较大,而又需要经常使用它的不同分支,那么最好把它各个分支都checkout出来。每个branch都从github上clone下来,会非常慢,也没有必要

    首先要明确下,git clone可以指定-b branch_name来克隆指定的branch,而如果不指定的话其实也只是克隆一个分支,只不过是HEAD对应的分支,最常见的情况下是master分支。

    其次明确下,git clone可以从本地文件系统进行:

    git clone file:///path/to/local/machine/repo
    
    #或者:
    git clone /path/to/local/machine/repo
    

    因此需要注意,从本地文件系统的repo进行git clone,只能指定本地文件系统repo中的本地分支。

    完整步骤举例:

    cd ~/work
    git clone https://github.com/opencv/opencv
    
    # 查看下有哪些分支
    git branch -a
    
    # 把所有的远程分支,都在本地创建同名分支
    # 参考:
    git branch -r | grep -v '->'  | grep -v `git branch | awk '/*/ { print $2; }'`| while read remote; do git branch --track "${remote#origin/}" "$remote"; done
    
    
    # 切换到其他工作目录,从本地文件系统的repo clone,速度飞起
    cd ~/work/
    git clone ~/work/opencv opencv_2.49  -b  2.4
    

    7. 设置git命令别名(alias)

    ~/.gitconfig添加:

    [alias]
        co = checkout
        ci = commit
        st = status
        br = branch
        hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
        type = cat-file -t
        dump = cat-file -p
    

    8. git checkout xxx后,git log显示不全?

    需要加上branch的名字。e.g.:

    git log master
    

    git hist master
    

    9. git打标签(tag)

    tag和branch的区别: branch是一系列的commit,tag则是一个commit。

    通常是对历史版本中某个commit打标签,步骤:

    git hist  #查看提交情况,用来获取commit id
    git co xxxxx # 切换到某个commit
    git tag tag_name #打标签,名字是tag_name
    

    10. git reset和git co的区别?

    不太懂,挖坑代填。

    11. git撤销修改

    分好几种情况

    1. 撤销工作区修改

    git  checkout  file_name  #检出某个文件
    

    git checkout . #整个目录都从新检出
    

    2. 撤销暂存区修改

    git reset file_name
    

    3. 撤销提交

    git revert HEAD
    

    其实我对git revert还不怎熟悉

    12. 从内网机器克隆代码

    从内网linux主机克隆到本地windows机器,使用ssh协议

    git clone ssh://zz@172.xx.xx.xx:/home/zz/work/cnn-infer-testbed
    

    从内网Windows主机克隆代码

    万能的方法是,在windows主机上临时开启git daemon,类似于python开启http server

    git daemon --base-path=<path_to_folder_containing_project_folder> --export-all
    

    然后在本地机器(client)上克隆:

    git clone git://<local ip>/<project name>
    

    ref: How to git clone a repo in windows from other pc within the LAN?

    注意:如果是从Windows主机clone到Linux上,在Linux上修改并commit后,无法git push回到Windows,见git server hosting using git:// protocol, unable to set SO_KEEPALIVE, no such file or directory。解决方案:在Windows上的repo中添加remote为Linux上的repo地址,e.g:

    git remote add linux-machine ssh://zz@172.xx.xx.xx:/home/zz/work/yyy
    git pull linux-machine master
    

    13. tag操作

    给当前commit添加tag:

    git tag my_tag_name
    

    给已有tag改名字:(则对应的commit此时有两个tag)

    git tag new old
    

    删除已有tag:

    git tag -d tag_name
    

    给远程的tag改名字,步骤:

    git tag new old
    
    git tag -d old
    
    git push origin :refs/tags/old
    
    git push --tags
    

    14. 忽略文件权限(mode)的差异

    比如我在Linux上git clone的代码,随后整个仓库拷贝到Window上,git st看到很多文件被改了,但是我实际上没有改,原因是文件的mode在复制的时候被改变了:

    $ git diff tools/script/test_android.sh
    diff --git a/tools/script/test_android.sh b/tools/script/test_android.sh
    old mode 100755
    new mode 100644

    解决办法也很简单:忽略mode的差异

    git config --global --add core.filemode false
    

    在commit中查找

    git hist --grep="feature"
    

    既然是用grep,自然想到grep -i,invert模式,找到“非xxx”的内容:

    git hist --grep="feature" --invert-grep
    

    15. 规范书写git commit

    规范的commit,排查问题方便,看起来也没管,是正规军的模样,例如:https://github.com/junluan/shadow/commits/master

    每次git commit时,注释中有提示信息。通过设定git的commit.template来增加提示信息(而不是修改):

    • 修改~/.gitconfig,添加:
    [commit]
        template = ~/.gitmessage
    
    • 新建~/.gitmessage,内容:
    # <type>: (If applied, this commit will...) <subject> (Max 50 char)
    # |<----  Using a Maximum Of 50 Characters  ---->|
    
    
    # Explain why this change is being made
    # |<----   Try To Limit Each Line to a Maximum Of 72 Characters   ---->|
    
    # Provide links or keys to any relevant tickets, articles or other resources
    # Example: Github issue #23
    
    # --- COMMIT END ---
    # Type can be
    #    feat     (new feature)
    #    fix      (bug fix)
    #    refactor (refactoring production code)
    #    style    (formatting, missing semi colons, etc; no code change)
    #    docs     (changes to documentation)
    #    test     (adding or refactoring tests; no production code change)
    #    chore    (updating cmake scripts etc; no production code change)
    # --------------------
    # Remember to
    #    Capitalize the subject line
    #    Use the imperative mood in the subject line
    #    Do not end the subject line with a period
    #    Separate subject from body with a blank line
    #    Use the body to explain what and why vs. how
    #    Can use multiple lines with "-" for bullet points in body
    # --------------------
    # For more information about this template, check out
    # https://gist.github.com/adeekshith/cd4c95a064977cdc6c50
    

    ref: 优雅的提交你的 Git Commit Message

    16. git clone使用https协议还是ssh协议,或者git协议?

    参考 学习 git clone 几种不同的协议,简而言之:

    • git clone https://gitlab.com/xxx/yyy 适合:初学者,或者克隆的是开源公共项目

    • git@gitlab.com:xxx/yyy.git 适合:项目maintainer,项目管理员,通常搭配ssh key,先生成和粘贴ssh公钥到gitlab上,第一次clone输入凭据,以后免密码

    其他的暂时不打算用。

    17. 管理ssh key

    管理多个ssh key

    例如,同时需要使用github, 公司gitlab服务器,gitee

    每个平台上最好分别设定ssh key,方便管理。

    参照这篇:GitLab配置ssh key,直接照着做好了,就先不粘贴整理了。

    粘贴ssh key遇到错误:Fingerprint 已经被使用 Fingerprint cannot be generated

    通常是用xshell、git-bash、scure-crt等终端连接到远程服务器时,cat查看ssh公钥内容时候有多余的换行,拷贝到gitlab的网页上后无法被正确识别。

    其实可以看出来的,正常的key是会自动帮你填写一个key的名字的,有多余空行的话就不自动生成key的名字。

    解决办法就是从samba打开公钥文件然后拷贝粘贴。

    18. 存储密码

    有时候代码仓库是用https协议的,没法改成ssh协议,每次输入密码很烦。设置记住密码即可:

    git config --localcredential.helper store
    

    如果要全局设定,则改用global参数:

    git config --global credential.helper store
    

    19. 使用git rebase

    git rebase的作用,是把当前分支的commit都临时取消掉,然后当前分支更新到指定分支的最新commit,在这个“最新”commit上,把本分支刚刚弄成patch的commit给“贴回去”,如果有冲突则需要手动解决一下。
    好处:相比较merge操作而言,避免了一次不必要的commit记录。

    让当前分支变基(rebase)为origin远端的master分支:

    git rebase origin/master
    

    20. 使用rebase和merge的场景

    下游分支(featrue1)更新上游分支(master)内容的时候用rebase
    上游分支合并下游分支内容的时候使用merge

    ref: Git16 Rebase

    个人的见解是:
    如果要合并两个分支的代码,如果没有冲突,用哪个都可以,需要考虑的仅仅是“多引入一个commit是否有必要”;
    如果要合并的两个分支的代码,有冲突,或者说有可能有冲突,那么根据冲突的优势劣势方来确定:

    • 如果被合并进来的分支,在冲突的代码中占主导优势,那么当前branch应当是作出让步的一方。用git rebase。
    • 如果被合并进来的分支,处于劣势,一旦有冲突会优先改掉、干掉被合并进来的这个分支的代码,那么应该用git merge

    21. git实践

    1. 利用orphan分支,在同一个repo中并行管理两个项目的代码
    2. 两个本地repo共用一个remote,独立开发和管理:基于branch和remote branch,以及git push默认分支的设定
    3. 利用git rebase和git squash,在git push到remote前压缩commit节点(参考:https://www.cnblogs.com/dsxniubility/p/4460834.html)

    22. 修改先前的本地commit的author

    首先

    git config --global user.name "xxx"
    git config --global user.email "xxx@yyy.com"
    

    然后:

    git commit --amend --reset-author
    

    23. COMMIT_EDITMSG文件出现问题

    git commit --amend时提示:

    .git/COMMIT_EDITMSG" E513: 写入错误,转换失败 (请将 'fenc' 置空以强制执行

    解决办法:删除.git/COMMIT_EDITMSG文件。然后退出现有git commit的vim窗口,重新git commit --amend即可。

    在操作git中有时候会提示 Unlink of file '......' failed. Should I try again?

    原因是你工作目录有某些文件正在被程序使用,这个程序多半是Idea,VS或者eclipse,当然也可能是其他程序

    解决方案不是简单的选择y或者n,而是关闭IDE,让IDE把这些文件释放掉

    ref: https://www.cnblogs.com/wormday/p/git_unlink_of_file_failed_should_i_try_again.html

    25. git遭遇文件名过长

    error: unable to create file xxx Filename too long
    出现在Windows下,git repo中的文件名绝对路径过长,创建失败。

    解决办法:

    git config --global core.longpaths true
    

    26. git reset --hard后恢复暂存区文件

    执行git reset --hard后,暂存区(先前执行过git add但是没commit)的文件变化就找不到了。实际上可以找到,不过比较hack,也不适合修改的文件很多的情况。

    find .git/objects/ -type f | xargs.exe ls -lt | sed 5q,此命令找到最近5次git add的文件的内容;

    git cat-file -p hash_value 查看对应哈希值的文件内容到屏幕上,可以配合重定向符号写入到文件。

    https://blog.csdn.net/yeluosc/article/details/76690678

    26. git reset三种模式(--hard --soft --mixed)的含义、差别

    通用命令格式:

    git reset --<reset_mode>  commit_id
    

    其中reset_mode--hard, --soft--mixed三种取值,--mixed是默认值;
    commit_id是提交记录中的某一个哈希值,也可以是HEADHEAD^1这样的表达式。

    git reset的三种模式,共同点是把本地仓库(repo)的HEAD切换到commit_id,不同点是“工作区、暂存区是否也跟着改变到commit_id中文件对应状态:

    • git reset --hard: 工作区、暂存区、本地仓库,都被切换到commit_id状态
    • git reset (--mixed): 暂存区、本地仓库被修改到commit_id状态,工作区不变
    • git reset --soft:只有本地仓库被切换到commit_id状态,工作区、暂存区都不变

    27. 查看最近一次commit修改了哪些文件?

    git log -1 --stat
    

    28. 恢复删除的branch

    Git会自行负责分支的管理,所以当我们删除一个分支时,Git只是删除了指向相关提交的指针,但该提交对象依然会留在版本库中。

    因此,如果我们知道删除分支时的散列值,就可以将某个删除的分支恢复过来。在已知提交的散列值的情况下恢复某个分支:

    git branch <branch_name> <hash_val>
    

    如果我们不知道想要恢复的分支的散列值,可以用reflog命令将它找出来。如:

    ref: Git删除分支/恢复分支

    29. 已经add过的文件,可以ignore吗?

    如果仅仅是add了,但是没有commit过,相对容易做到。

    原理:从暂存区取消记录文件/文件夹。

    也就是:

    git rm --cached file.txt   # 取消track单个文件
    git rm --cached imgs -r    # 取消track单个文件夹
    

    30. git clone后打开文件显示乱码

    通常是如下几个条件共同产生的:

    • 在Windows下编写的代码
    • 代码里有中文
    • 代码文件格式不是UTF-8

    解决:批量转换为UTF-8编码:

    find . -name '*.cpp' -exec enca -L zh_CN -x UTF-8 {} ;
    find . -name '*.h' -exec enca -L zh_CN -x UTF-8 {} ;
    

    31. git add仅添加已追踪的文件

    git add -u即可

    在git中有好多的指令,但是今天这几个指令就很容易忘记而且还容易混淆
    git add -u <==> git add –update
    提交所有被删除和修改的文件到数据暂存区

    git add .
    提交所有修改的和新建的数据暂存区

    git add -A <==> git add –all
    提交所有被删除、被替换、被修改和新增的文件到数据暂存区

    来源:https://blog.csdn.net/dayewandou/article/details/78513578

    32. 使用git rebase的一个典型场景

    git checkout -b dev
    echo "hello" >> info.txt
    git add .
    git commit -m "add sth"
    git checkout master
    git merge dev
    

    33. git使用socks代理加速

    开启ss后查看端口,例如我是1080,则:

    git config --global http.proxy 'socks5://127.0.0.1:1080'
    git config --global https.proxy 'socks5://127.0.0.1:1080'
    

    然后就能高速使用git下载源码了。

    34. 用gitolite搭建git服务器

    2015-08-21 23:33

    心血来潮的先在本地的fedora-server上装配了起来。
    用gitolite搭建git服务器,作为代码版本控制server。gitolite比较流行,官方文档齐全。

    fedora22下配置gitolite

    一台server:我使用fedora22-server

    依赖项:perl-devel, git-core, openssh

    主要参考git服务器的建立——Git折腾小记

    可能遇到的问题:

    Can't locate Time/HiRes.pm in @INC (@INC contains: /home/git/gitolite/src/lib /usr/local/lib/perl5 /usr/local/share/perl5 /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5 /usr/share/perl5 .) at /home/git/gitolite/src/lib/Gitolite/Common.pm line 76.
    

    需要安装perl-devel:

    sudo dnf install perl-devel
    

    ssh公钥的设定

    workstation上的gitolite设定好了,给用户使用的时候,用户每次都输入密码不方便,一个策略是使用ssh-key。通过在客户端上生成rsa的公钥,上传到gitolite-admin这个repo的keydir中,并以用户名.pub形式命名,然后在此repo的conf目录中的配置文件中对指定repo进行读写权限的设定。
    具体设定的语法规则,可以去查看gitolite的manual。
    值得注意的一点是:在添加rsa的公钥文件后,请git add keydir,否则这个文件没有被track,在配置文件中的配置也就不会生效。

    CentOS7下gitolite3的配置

    # 先确保添加了epel的repo
    yum install gitolite3
    

    按照/usr/share/doc/gitolite-3/下的readme文档进行配置,出了点问题:配置到各种git config --global后,要git clone gitolite-admin了,一直提示没有权限。ssh-key也添加了。google一番发现:ref

    [root@dlp ~]# su - gitolite3
    -sh-4.2$ ssh-keygen -f ~/.ssh/gitadmin 
    Generating public/private rsa key pair.
    Enter passphrase (empty for no passphrase): # set passphrase
    Enter same passphrase again: # confirm
    Your identification has been saved in /var/lib/gitolite3/.ssh/gitadmin.
    Your public key has been saved in /var/lib/gitolite3/.ssh/gitadmin.pub.
    The key fingerprint is:
    xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx gitolite3@dlp.server.world
    The key's randomart image is:
    -sh-4.2$ gitolite setup -pk ~/.ssh/gitadmin.pub 
    Initialized empty Git repository in /var/lib/gitolite3/repositories/gitolite-admin.git/
    Initialized empty Git repository in /var/lib/gitolite3/repositories/testing.git/
    -sh-4.2$ vi ~/.ssh/config
    # create new
    # any name you like
    host GitServer
        user gitolite3
        # Git server's hostname or IP address
        hostname 10.0.0.30
        port 22
        # secret key
        identityfile ~/.ssh/gitadmin
    -sh-4.2$ chmod 600 ~/.ssh/config 
    -sh-4.2$ git config --global user.name "gitolite3" 
    -sh-4.2$ git config --global user.email "gitolite3@server.world" 
    -sh-4.2$ git config --global push.default simple
    # clone admin repository to finish setup
    -sh-4.2$ git clone ssh://GitServer/gitolite-admin 
    Cloning into 'gitolite-admin'...
    The authenticity of host '10.0.0.30 (10.0.0.30)' can't be established.
    ECDSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '10.0.0.30' (ECDSA) to the list of known hosts.
    Enter passphrase for key '/var/lib/gitolite3/.ssh/gitadmin':
    remote: Counting objects: 6, done.
    remote: Compressing objects: 100% (4/4), done.
    remote: Total 6 (delta 0), reused 0 (delta 0)
    Receiving objects: 100% (6/6), done.
    

    35. git获取所有分支(fetch all branches)

    在StackOverFlow上的问答: How to fetch all Git branches

    可能会遇到提示:'fatal: A branch named 'origin/master' already exists.'

    解决办法:用如下命令:

    git branch -r | grep -v '->'  | grep -v `git branch | awk '/*/ { print $2; }'`| while read remote; do git branch --track "${remote#origin/}" "$remote"; done
    

    36. git clone pytorch或caffe速度慢

    可以从gitee导入github repo,而pytorch的话,submodule比较多,也要导入。

    我在gitee的两个账号 aczz 和 arczz,里面有很多submodule,可以考虑试试。不过可能比较旧了。

    37. 可以只fetch某一次commit吗

    场景:希望学习某个repo是如果写出来的,则新建一个本地空repo(git init),添加remote后fetch,再cherry-pick即可。

    举例:

    mkdir dev-easycnn
    cd dev-easycnn
    git init
    git remote add origin https://gitee.com/aczz/EasyCNN
    git fetch origin
    git cherry-pick bf22931
    

    38. 创建orphan分支

    在一个已有commit的repo中创建orphan分支。

    cd repo
    git checkout --orphan dev
    git rm -rf .
    

    39. 显示本地分支和远程分支的跟踪关系

    git branch -vv
    
  • 相关阅读:
    LeetCode 258 Add Digits
    LeetCode 231 Power of Two
    LeetCode 28 Implement strStr()
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 21 Merge Two Sorted Lists
    LeetCode 20 Valid Parentheses
    图形处理函数库 ImageTTFBBox
    php一些函数
    func_get_arg(),func_get_args()和func_num_args()的用法
    人生不是故事,人生是世故,摸爬滚打才不会辜负功名尘土
  • 原文地址:https://www.cnblogs.com/zjutzz/p/13340328.html
Copyright © 2020-2023  润新知