提起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  .git
.git
├── branches
├── COMMIT_EDITMSG
├── config <--- 就是这个
├── description
├── HEAD
├── hooks
├── index
├── info
├── logs
├── objects
└── refs directories, files

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

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

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

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

cv@cv: ~/git_repo $ git config --list
user.email=phillee2016@.com
user.name=philleer
core.repositoryformatversion=
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.name=philleer
user.email=phillee2016@.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 ] detached state
files changed, insertions(+)

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

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

这时再查看本地仓库状态可以发现,已经成功新建了分支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 ... 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 ). 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 : 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: , done.
Counting objects: % (/), done.
Delta compression using up to threads
Compressing objects: % (/), done.
Writing objects: % (/), 1.43 KiB | 1.43 MiB/s, done.
Total (delta ), reused (delta )
remote: Resolving deltas: % (/), completed with 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

未完待续

Git常用进阶操作之一的更多相关文章

  1. Git常用的操作指令

    修改最后一次提交 有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了.想要撤消刚才的提交操作,可以使用--amend 选项重新提交: 1 $ git commit --amend -m& ...

  2. git常用命令操作

    git常用命令 #查看配置 git config -l #查看系统config git config --system --list #查看当前用户(global)配置 git config --gl ...

  3. Git常用的操作

    1.git使用的常规操作     git pull——>编辑——>git add——>git commit——>git push 用git add把文件添加进去,实际上就是把文 ...

  4. Git常用的操作记录(自用)

    分支常用操作命令 $ git branch -a //查看分支 $ git checkout -b dev origin/master  //切换/创建分支 $ git branch -vv 或 gi ...

  5. Git 常用场景操作

    git init      在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹.   git clone      获取一个u ...

  6. git常用小操作。-- 自用

    编辑 .gitignore bin-debug/  忽略所有的叫bin-debug文件夹和他下面的文件 编辑 .git/config [core] repositoryformatversion = ...

  7. Git常用分支操作

    新建分支 git branch branchname 切换到分支dev git checkout branchname 查看所有的分支信息 git branch -a 查看远程分支信息 git bra ...

  8. git 常用命令操作

    目录 一.用户和邮箱 用户和邮箱的作用 查看用户名和邮箱地址 修改用户名和邮箱地址 用户名和邮箱地址的作用 用户名和邮箱地址是本地git客户端的一个变量,不随git库而改变. 每次commit都会用用 ...

  9. git常用相关操作

    // 账号密码克隆远程项目 git clone http://账号:密码@项目地址 // 查看当前状态 git status // 查看修改内容 git diff // 添加并提交 git add . ...

随机推荐

  1. day20191106

    笔记: 一.#{}和${}的区别是什么 1)#{}是预编译处理,${}是字符串替换.2)Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 ...

  2. mysql 基础知识整理

    什么是MySQL? MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展.阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的. ...

  3. 第三章 学习Shader所需的数学基础(2)

    目录 1.坐标空间 1.2 坐标空间的变换 @ 1.坐标空间 我们在以前渲染流水线中就接触了坐标空间的变换.例如,在学习顶点着色器流水线阶段时,我们说过,顶点着色器的最基本功能就是把模型的顶点坐标从模 ...

  4. 8. SOFAJRaft源码分析— 如何实现日志复制的pipeline机制?

    前言 前几天和腾讯的大佬一起吃饭聊天,说起我对SOFAJRaft的理解,我自然以为我是很懂了的,但是大佬问起了我那SOFAJRaft集群之间的日志是怎么复制的? 我当时哑口无言,说不出是怎么实现的,所 ...

  5. linux中RabbitMQ安装教程

    linux中RabbitMQ安装教程 在做一个微服务项目时候用到消息队列,于是深入了解了消息队列知识,并在linux上安装了Rabbitmq,本博客介绍Rabbitmq的安装教程,想要深入了解消息队列 ...

  6. Golang中的布隆过滤器

    目录 1. 布隆过滤器的概念 2. 布隆过滤器应用场景 3. 布隆过滤器工作原理 4. 布隆过滤器的优缺点 5. 布隆过滤器注意事项 6. Go实现布隆过滤器 1. 布隆过滤器的概念 布隆过滤器(Bl ...

  7. Linux编辑器vi使用方法详细介绍(转)

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...

  8. [TimLinux] TCL 自定义包

    1. 包 很多功能存放在一起,定义为一个包,在iTcl(Incr TCL)之后,可以定义一个类,类可以放在一个包里面,包为一个独立的文件,可以为TCL文件,也可以为C/C++语言实现的动态库. 2. ...

  9. CSU OJ1960

    有一棵由N个结点构成的树,每一条边上都有其对应的权值.现在给定起点,求从该点出发的一条路径(至少有一条边)使得这条路径上的权值之和最大,并输出这个最大值. Input 第一行一个正整数T,代表数据组数 ...

  10. iSensor APP 之 摄像头调试 OV9655 测试之二

    参考上一篇博客 iSensor APP 之 摄像头调试 OV9655 本次链接主要介绍,使用ov9655输出QVGA格式,320*240  YUV输出,图像效果还不错,用户可以参考此模板改变分辨率,不 ...