• Git常用进阶操作之一


    提起Git,经常做项目的我们都不陌生,我们常用的功能有哪些呢?

    这里按个人使用情况简单总结一下。

    像新建远程仓库、新建分支这些就不说了,不熟的同学可以翻看我前面写的git基本操作

    • 1.首先提一下为每个项目建立不同的用户名和邮箱

    通常我们直接在命令行可以查看和设置user.name和user.email

    cv@cv: ~/git_repo$ git config --global user.name "philleer"
    cv@cv: ~/git_repo$ git config --global user.email "phillee2016@163.com"

    这是一种全局的git用户名和邮箱设置,那如果我们想要为当前项目指定用户名和邮箱而同时不会影响其他项目的这些设置,该怎么做呢?

    很简单,直接在当前本地仓库目录下进行设置。一种是命令行直接修改(推荐)

    cv@cv:~/git_repo$ git config user.name "philleer"
    cv@cv:~/git_repo$ git config user.email "phillee2016@163.com"

    另一种是找到当前目录下的.git文件夹进入,找到config文件

    cv@cv:~/git_repo$ tree -L 1 .git
    .git
    ├── branches
    ├── COMMIT_EDITMSG
    ├── config    <--- 就是这个
    ├── description
    ├── HEAD
    ├── hooks
    ├── index
    ├── info
    ├── logs
    ├── objects
    └── refs
    
    6 directories, 5 files

    使用 VIM/gedit 等编辑器打开,在末尾加入三行

    [user]
        name = philleer
        email = phillee2016@163.com

    其实前面的方式也是在该文件中添加此项内容,只不过是通过命令形式直接进行的。

    完成后可以使用 git config --list 查看

    cv@cv: ~/git_repo $ git config --list
    user.email=phillee2016@163.com
    user.name=philleer
    core.repositoryformatversion=0
    core.filemode=true
    core.bare=false
    core.logallrefupdates=true
    user.name=philleer
    user.email=phillee2016@163.com
    remote.origin.url=https://github.com/philleer/git_repo_for_trail.git
    remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
    branch.master.remote=origin
    branch.master.merge=refs/heads/master

    命令的输出中包含全局配置+当前项目配置,上面的是全局配置,使用时优先使用当前项目配置。

    • 2. git处于游离分支时如何处理才能保存修改?

    一般情况下我们使用命令 git checkout <branch_name> 进行分支之间的切换,这是HEAD就会移动指向指定分支。

    但是,如果我们使用的是 git checkout <commit_id> 也就是说无意间切换到了某次提交所在的状态上,而我们可能又在此状态进行了一系列修改,这时我们会发现HEAD处于一种 [ detached ] 状态,也就是游离状态。

    如果此时我们对修改进行了提交,系统默认会新开一个匿名分支,也就是说我们的提交是无法可见保存的,一旦切换到其他分支,在游离状态进行的提交就不可追溯了。

    此时查看本地仓库状态,结果如下所示,

    cv@cv:~/git_repo$ git status 
    HEAD detached at 44066c6
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   ../CMakeLists.txt
        modified:   ../src/CacheFunction.cc
        modified:   ../src/CacheFunction.h
    
    no changes added to commit (use "git add" and/or "git commit -a")

    查看当前所在分支,由于目前处于之前本地提交的一个commit上,并未push到远程仓库,因此HEAD就处于我们所说的游离状态

    cv@cv:~/git_repo$ git branch 
    * (HEAD detached at 44066c6)
      detach_test
      feature_x
      master

    此时先把修改的内容进行提交

    cv@cv:~/git_repo$ git add -A
    cv@cv:~/git_repo$ git commit -m "detached state"
    [detached HEAD 2959523] detached state
     3 files changed, 14 insertions(+)

    然后以提交后新的<commit_id>创建临时分支,也就是说通过此操作将游离状态的修改保存到一个新建的临时分支,这样就不用再担心之后分支切换导致无法追溯游离状态的问题

    cv@cv:~/git_repo$ git reflog
    2959523 HEAD@{0}: commit: detached state
    44066c6 HEAD@{1}: checkout: moving from detach_test to 44066c6
    0ca3a35 HEAD@{2}: commit: test the opencv link
    
    cv@cv:~/git_repo$ git branch tmp 2959523

    这时再查看本地仓库状态可以发现,已经成功新建了分支tmp,只是暂时还没有切换过去,目前仍处于游离状态

    cv@cv:~/git_repo$ git branch
    * (HEAD detached from 44066c6)
      detach_test
      feature_x
      master
      tmp

    最后切换分支,将tmp分支merge到指定分支,然后删除临时分支tmp,over!

    cv@cv:~/git_repo$ git checkout detach_test
    Previous HEAD position was 2959523... detached state
    Switched to branch 'detach_test'
    
    cv@cv:~/git_repo$ git merge tmp 
    Auto-merging src/CacheFunction.h
    CONFLICT (content): Merge conflict in src/CacheFunction.h
    Auto-merging src/CacheFunction.cc
    Automatic merge failed; fix conflicts and then commit the result.
    cv@cv:~/git_repo$ vim ../src/CacheFunction.cc
    
    cv@cv:~/git_repo$ git status 
    On branch detach_test
    You have unmerged paths.
      (fix conflicts and run "git commit")
    
    Changes to be committed:
        modified:   ../src/CacheFunction.cc
    
    Unmerged paths:
      (use "git add <file>..." to mark resolution)
        both modified:   ../src/CacheFunction.h
    
    cv@cv:~/git_repo$ vim ../src/CacheFunction.h 
    
    cv@cv:~/git_repo$ git add ../src/CacheFunction.h
    
    cv@cv:~/git_repo$ git status 
    On branch detach_test
    All conflicts fixed but you are still merging.
      (use "git commit" to conclude merge)
    
    Changes to be committed:
        modified:   ../src/CacheFunction.cc
        modified:   ../src/CacheFunction.h
    
    cv@cv:~/git_repo$ git commit -m "fix the merge conflict"
    [detach_test 13c6720] fix the merge conflict
    
    cv@cv:~/git_repo$ git status 
    On branch detach_test
    nothing to commit, working directory clean
    cv@cv:~/git_repo$ git branch -d tmp 
    Deleted branch tmp (was 2959523).
    
    cv@cv:~/git_repo$ git branch 
    * detach_test
      feature_x
      master

    至此,处理完毕,HEAD指向正常分支。

    • 3. 为什么有时候设置的忽略规则不起作用?

    在使用 Git 的过程中,我们经常会忽略追踪一些诸如日志文件、临时文件、编译中间文件等不希望提交到远程仓库的非核心更改,这时可以通过 .gitignore 文件设置相应的忽略规则。

    然而有些时候,我们明明已经设置好了自定义规则,在使用 git status 查看文件状态时依然会看到不想提交的更改,这时什么原因造成的呢?

     .gitignore 只能忽略那些原本没有被 Track 的文件,如果某些文件已经被纳入了版本管理之中,也就是说在我们设置忽略规则之前对其中的一些文件曾经进行过跟踪或已经产生过提交,那么再修改 .gitignore 也不能忽略这些文件或更改了。

    至于解决方法,先把本地缓存删除,使这些更改重新变成未 Track 的状态,然后再提交就可以了。

    cv@cv: ~/git_repo$ git rm -r --cached .
    cv@cv: ~/git_repo$ git add .
    cv@cv: ~/git_repo$ git commit -m "something to commit the modification"
    • 4. 使用代理服务器时出现的 Failed to connect to github.com port 443: Timed out 问题
    cv@cv: ~/cpp/coding$ git pull origin master
    fatal: unable to access 'https://github.com/philleer/coding.git/': Failed to connect to github.com port 443: Timed out

    当我们使用系统环境代理如 Lantern 或 Shadow-socks 时,在进行 git clone, git pull, or git push 时可能会出现上述连不上 GitHub 服务器的问题,这时可以查看一下 git 代理设置

    cv@cv: ~/cpp/coding$ git config --list | grep proxy
    
    cv@cv: ~/cpp/coding$ git config --global --list | grep proxy

    查看一下自己代理服务器的网址及端口,例如我的是 http://127.0.0.1:7224 ,利用以下命令设置

    cv@cv: ~/cpp/coding$ git config --global http.proxy http://127.0.0.1:7224
    
    cv@cv: ~cpp/coding$ git config --global https.proxy https://127.0.0.1:7224

    然后再进行自己的 git 工作即可

    cv@cv: ~/cpp/coding$ git push origin master
    Enumerating objects: 6, done.
    Counting objects: 100% (6/6), done.
    Delta compression using up to 2 threads
    Compressing objects: 100% (4/4), done.
    Writing objects: 100% (4/4), 1.43 KiB | 1.43 MiB/s, done.
    Total 4 (delta 1), reused 0 (delta 0)
    remote: Resolving deltas: 100% (1/1), completed with 1 local object.
    To https://github.com/philleer/coding.git
       956e37d..6c0d66c  master -> master

    而当我们没有代理时出现以上错误同样需要检查 http.proxy 和 https.proxy ,如果设置了 git 代理要记得取消

    cv@cv: ~/cpp/coding$git config --global --unset http.proxy
    
    cv@cv: ~/cpp/coding$git config --global --unset https.proxy
    • 5. 强制本地项目与远程仓库同步

    有时候由于本地各种魔改,导致本地代码污染严重,需要从远程仓库中拉取最新代码强制覆盖的情况。

    解决方法:

    Step 1 当存在多个分支时,首先切换到当前的分支

    比如我需要覆盖分支 feature_dev 的代码

    git checkout feature_dev

    Step 2 然后 git 强行 pull 并覆盖本地文件

    git fetch --all
    
    git reset --hard origin/feature_dev
    
    git pull

    Step 3 这时查看 git log 可以看出代码已经同步成远端的最新版本了。

    未完待续

  • 相关阅读:
    文件处理
    字符编码的了解以及简单的文件处理
    python list去重加set排序
    数据的类型以及内置方法
    Python 入门 Day5
    Python 入门 Day3
    Python的入门
    计算机硬件
    【0903 | Day 29】反射和内置方法
    【0902 | Day 28】绑定方法和非绑定方法
  • 原文地址:https://www.cnblogs.com/phillee/p/11497726.html
Copyright © 2020-2023  润新知