Fork me on GitHub

Git入门使用指南

Git简介

下面是摘自官网的一段话:

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

简而言之,Git是一个优秀的分布式版本管理软件。

安装

打开Git官网:git-scm.com,下载并安装。
Debian或Ubuntu Linux,通过一条sudo apt-get install git就可以直接完成Git的安装。

安装完成后,windows打开git-bash,linux直接打开terminal

初始化配置

配置用户信息(和Github上一致):用户名和邮箱地址:

1
2
git config --global user.name "qwerty200696"
git config --global user.email "wang@126.com"

如果之前已经配置好了,可以使用如下命令查看:

1
2
git config user.name
git config user.email

还可以配置颜色和行尾。不同平台的行尾是有显著区别的。

1
2
3
4
git config --global core.autocrlf true
git config --global core.autocrlf input
git config --global color.ui auto

其他配置:
配置的级别分为:globallocalsystem三种级别,local会覆盖global。就像面向对象的继承那样,最近的是最有效的,也就是local

init&add——开始与添加

选择需要版本控制的文件夹,打开终端(linux)或者Git Bash(windows)。

初始化Git:

1
git init

最好的方法是在开始一个项目之前,通过git init xxx来新建一个项目目录xxx。git会自动创建该xxx目录。

假设文件夹下存在需要版本管理的文件,使用如下命令查看是否已经被管理:

1
git status

添加需要管理的文件:

1
2
git add 1.py # 某个具体的文件
git add . # 添加文件夹下所有的文件

可以在目录下创建一个名为.gitignore的文件,在其中输入需要忽略的文件。

commit——提交修改

1
git commit -m "first commit"

修改内容之后,使用commit提交。

1
git log

log命令可以查看每次的更改。

目前都是在本地化的版本管理。

diff——显示不同

现在假设你修改了一个文件,但是过去了一段时间后忘记修改在什么地方了,此时你需要“diff”。

1
2
3
4
5
6
7
git diff # 文件的最新改动
git diff --staged # 已经暂存的和最近历史的改动。
git diff HEAD # HEAD提交历史中,最近一次的别名,最新的修改与最近历史的改动。跳过了暂存的修改,直接与最近一次提交的比较。
git diff --color-words # 只对修改的地方用不同颜色标记,而不是整行。
git diff --word-diff # 对长行的小改动更加清晰明了。
git diff --stat # 极简输出,只输出改动的文件,阻止其他输出。

log——查看修改

log是一个非常强大的明了,不仅可以查看提交的历史记录,而且是了解仓库的进展、提交的内容以及文件的好帮手。

1
2
3
4
5
6
git log
git log --oneline # 更常用!
git log --stat #可以查看修改的文件。
git log --patch # 可以查看文件中具体的修改内容。
git log --graph --all --decorate --oneline # z展示每次提交的一行概括。

remove——删除文件

删除文件。两种方式,一种是git rm,一种是git add

git rm 用来删除一个文件;并且会自动暂存修改。

此外,如果用rm删除了一个文件,可以使用git rm再次暂存修改。

现实情况中,往往会有很多文件被删除了,不可能通过命令行一个个修改。

1
Git add -u . # 注意,最后的dot不能省略哦,表示当前目录

改命令会遍历文件夹,并且查找出所有删除的文件,并且暂存。

有时候只是想要从git中删除,但是本地文件不删除,使用如下命令:

1
git rm --cached xxx_file

你是真的想在所有历史记录中删除这个文件的记录吗?这是另一个主题中会讲。或者你是不想要某个文件被追踪,之后也是这样,那么可以使用git ignore文件,在之后也会介绍。

move——移动文件

移动文件。

1
git mv xxx_file otherPath/xxx.file

1
git add -A .

找出所有的移动过的文件。(包括修改之后移动的文件)

追踪移动过的文件的历史:

1
2
3
git log -- path/file # 只会追踪到该目录下的历史,历史会终止在移动的时候。
git log --stat -M --follow -- path/file # 跨目录追踪历史,文件在移动过程中也追踪。

在移动文件之后,commit给我们一个数字来告诉我们文件在移动前后的相似度。Git提供的默认阈值是50%的相似度,超过50%,在移动前后就会继续追踪该文件。

ignore——忽略文件

可以在目录/子目录下创建一个名为.gitignore的文件,在其中输入需要忽略的文件/文件夹。

只能对当前目录的文件/文件夹进行忽略。 可以使用匹配符,在当前目录/子目录都有效。

子目录中,需要路径优先级??
也可以使用“!”反忽略某一个特定的文件。
注释行用“#”号开头。

查看忽略了的文件:

1
2
3
git ls-files --others --ignored --exclude-standard ## 查看忽略的文件
git ls-files --ignored --exclude-standard

为什么我感觉不需要加上 --others也可以。而且第二个命令更靠谱。

以上述的第一个命令为主。
如果你感觉第一个命令不行的话,那是因为在某些文件先前已经被纳入了版本管理中,就算是在.gitignore中已经声明了忽略路径也是不起作用的,这时候我们就应该先把本地缓存删除,然后再进行git的push,这样就不会出现忽略的文件了。git清除本地缓存命令如下:【参考资料二】

1
2
3
git rm -r --cached .
git add .
git commit -m 'update .gitignore'

关于ignore规则的详细介绍,可参考这篇博文,写得很详细。

branch——开始新分支

创建与删除

1
2
3
git branch newBranchName ## 创键分支
git branch -d existedBranchname ## 删除分支,没有合并的话会出错
git branch -D existedBranchname ## 删除分支,强制删除

switch——切换分支

1
git checkout existedBranchname

checkout的其他用法

最主要的作用就是切换分支,上面已经讲过了。

1
2
git branch
git status

都可以查看目前处于那个分支上面。

撤销内容:

1
git checkout -- filename.txt

会清理掉最后一次commit的内容。

1
git checkout -b newBranchName

一步到位,既创建了一个新的branch,也转移到了新的branch。

如果在使用checkout命令的时候,不小心将头指针分离了,如下所示:

1
2
3
4
wangwlj@myUbuntu:~/文档/py_prog/py3_prog$ git branch -a
* (头指针分离于 ee74fc7)
master
program

当我们发现头指针游离于分支之外的时候,不要惊慌,再次git checkout program切换到已经存在的分支即可。

merge——分支合并

1
2
git checkout master ## 切换到主分支
git merge branchNeedToMerge ## 将分支branchNeedToMerge的修改合并到master

merge冲突的解决

merge冲突:两个文件都有变化,Git无法确定该怎么合并。该如何解决呢?

先用git status查看是哪个文件冲突 ,然后用编辑器打开,进行修改。

先查找<<<<<<< HEAD标志,表明是当前branch上的内容,直到=======标志结束。
=======标志的下方,直到>>>>>>> branchNeedToMerge标志结束,是另一个分支的内容。

找到位置后,需要手动地解决冲突:编辑文件,删去冲突的标签,决定该删去或保留哪些内容,保存即可。最后重新add、commit提交。

abort——放弃冲突

放弃这个冲突(不重要),从上次commit开始,并且清除暂存区。

1
git merge --abort

squash压缩

1
2
git merge --squash branchNeedToMerge
git commit -m "some message"

意思是 你在分支branchNeedToMerge里面做了很多次commit修改,但是修改很零碎;在master分支里只想要一次commit就更新到branchNeedToMerge分支的进度。此时就可以使用--squash参数。

判断是否使用--squash选项最根本的标准是,待合并分支上的历史是否有意义。

关于--squash 参数的举例可参考这篇文章

-d 删除分支

1
git branch -d branchNeedToMerge

Network

Remotes

1
git remote add origin <server>

<server>是远程服务器的地址、目的地的url。

小技巧:仓库地址的格式写为:https://用户名:密码@github.com/用户名/xxx.git,可以免去每次都输入用户名以及密码的麻烦!!(最好在个人电脑中这样使用,因为每次push都会显示用户名密码。)

如果输错了或者忘记了也不要紧,可以输入如下命令重新设置:

1
2
3
4
5
git remote set-url origin <new-server>
上述对应的是第一种用法:git remote set-url [--push] <名称> <新的地址> [<旧的地址>]
此外还有:git remote set-url --add <名称> <新的地址>
以及:git remote set-url --delete <名称> <地址>

查看远程的地址有哪些:

1
git remote -v

最后删除远端地址:

1
git remote rm origin

fetch/pull/push

1
2
3
git fetch origin
git pull origin
git push origin

fetch:去github.com上面下载信息,放在远程追踪分支。,
pull:与fetch非常像,下载下来放到远程,并且合并到本地。
push:电脑上完成了工作,发送到github上面。

fork/pull requests

fork:拷贝到自己的仓库进行修改,最好新建分支。
pull requests:对他人的代码进行修改,提意见

reset——重置

reset有三个等级,默认的是mixed,除此之外还有softhard

1
2
3
git reset --soft HEAD~5 # 选择需要重置commit的次数
git status
git commit -m"new message" # 重新提交

reset在对仓库历史提交的处理上比较有用,当然也是一个危险的命令啦。

checkout可以做类似的事情,checkout更加关注的是一个目录或者文件级别的精度。也就是说,可以把某个文件拉回到几次提交之前的状态。

reflog

包括reset做的那些不可恢复的操作,reflog都有记录。
但默认提供的是30天的保存时间。

1
git reflog

也可以图形化查看历史:

1
gitk --all `git reflog | cut c1-7`&

reflog让我们有动力地去多做commit,commit了就有保障了。

参考资料

------ 本文结束感谢您的阅读 ------
坚持原创技术分享,您的支持将鼓励我继续创作!