git使用(上)

Git使用(上)

1、Git配置

使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名,每次提交记录里都会包含这些信息。

git config --global user.name "XXX"
git config --global user.email "XXX@gmail.com"

执行了上面的命令后,会在家目录(/home/lxz)下建立一个叫.gitconfig的文件(该文件是隐藏文件,需要使用ls -al查看到),内容一般像下面这样,可以使用vim或cat查看文件内容:

cat ~/.gitconfig
[user]
    name = XXX
    email = XXX@gmail.com

上面的配置文件就是Git全局配置的文件,一般配置方法是git config –global

如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config命令不带–global选项来设置,这会在你项目目录下的.git/config文件增加一节[user]内容(如上所示)。对于新建项目,这部分定制操作需要在git初始化之后才可以执行。

2、获得一个Git仓库

既然我们现在把一切都设置好了,那么我们需要一个Git仓库。有两种方法可以得到它:一种是从已有的Git仓库中clono;还有一种是新建一个仓库,把未进行版本控制的文件进行版本控制。

2.1、Clone一个仓库

为了得到一个项目的拷贝,我们需要知道这个项目仓库的地址(Git URL)。Git能在许多协议下使用,所以Git URL可能以ssh://,http(s)://,git://,或者只是以一个用户名(git会认为这是一个ssh地址)为前缀。有些仓库可以通过不只一种协议来访问,例如,Git本身的源代码你即可以用git://协议来访问:

git clone http://git.XXX.com/XXX/gitproject

也可以通过http协议来访问:

git clone http://github.com/XXX/gitproject.git

当前git project仅是测试项目,里面仅有一个README.md文件

2.2、初始化一个新的仓库

可以对一个已存在的文件夹用下面的命令让它配置于Git的版本控制管理之下,创建文件夹

mkdir project

添加文件及文件内容

echo "test content" > project/testfile.txt

Git仓库初始化

cd project
git init

Git会输出:

Initialized empty Git reposity in /home/lxz/project/.git/

通过ls -la命令会发现project目录下会有一个名叫.git的目录被创建,这意味着一个仓库被初始化了。

3、正常的工作流程

3.1、正常的工作流程

进入我们刚才建立的project目录,创建文件file1, file2, file3

cd project
touch file1 file2 file3

修改文件,可以使用vim编辑内容,也可以直接echo添加测试内容,将它们更新的内容添加到索引中。

echo "testcontent1" >> file1
echo "testcontent2" >> file2
echo "testcontent3" >> file3
git add file1 file2 file3

你现在为commit做好了准备,你可以使用git diff命令再加上–cached参数,看看哪些文件及内容将被提交(commit)。进入git diff –cached界面后需要输入q才可以退出。

git diff --cached

(如果没有–cached参数,git diff会显示当前你所有已做的但没有加入到索引里的修改)你也可以用git status命令来获得当前项目的一个状况:

git status

如果你要做进一步的修改,那就继续做,做完之后就把新修改的文件加入到索引中,最后把它们提交:

git commit -m "put a message to commit"

需要使用-m添加本次修改的注释,完成后就会记录一个新的项目版本,除了用git add命令,我们还可以用

git commit -a -m "put a message to commit"

这会自动把所有内容被修改的文件(不包括新创建的文件)都添加到索引中,并且同时提交它们。

4、分支与合并

4.1、分支

一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫experimental的分支

git branch experimental

如果你运行了下面这条命令

git branch

你会得到当前仓库中存在的所有分支列表

experimental
*master

experimental分支是你刚才创建的,master分支是Git系统默认创建的主分支。星号(“*”)标识了你当前工作在哪个分支下,输入:

git checkout experimental

切换到“experimental”分支,先编辑里面的一个文件,再提交(commit)改动,最后切换回“master”分支。

git commit -a -m "put a message to commit"
git checkout master

你现在可以看一下你原来在“experimental”分支下所作的修改还在不在;因为你现在切换回了“master”分支,所以原来那些修改就不存在了。你现在可以在“master”分支下再做一些不同的修改:

git commit -a -m "put a message to commit"

这时,两个分支就有了各自不同的修改(diverged);我们可以通过下面的命令来合并”experimental”和“master”两个分支。

git checkout master
git merge experimental

如果这两个分支间的修改没有冲突(conflict),那么合并就完成了。如果有冲突,输入下面的命令就可以查看当前有哪些文件产生了冲突

git diff

当你编辑了有冲突的文件,解决了冲突后就可以提交了

git commit -a -m "put a message to commit"

这时你就可以删除掉你的“experimental”分支了(如果愿意)

git branch -d experimental

git branch -d只能删除那些已经被当前分支的合并的分支。如果你要强制删除某个分支的话就用git branch -D;下面假设你要强制删除一个叫“crazy-idea”的分支

git branch -D crazy-idea
4.2、解决合并中的冲突

如果执行自动合并没有成功的话,git会在索引和工作树里设置一个特殊的状态,提示你如何解决合并中出现的冲突。有冲突的文件会保存在索引中,除非你解决了问题并且更新了索引,否则执行git commit都会失败,如果执行git status会显示这些文件没有合并,这些有冲突的文件里面会添加像下面的冲突标识符

<<<<<<< HEAD:file.txt
Hello world
======
Goodbye
>>>>>>77976da35a11db4580b80ae27e8d65caf5208086:file.txt

你所需要做的是编辑解决冲突(比如使用vim编辑有冲突的文件,接着把冲突标识符删掉),再执行下面的命令

git add file.txt
git commit -m "put a message to commit"
4.3、撤销一个合并

如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态

git reset --hard HEAD^

或者你已经把合并后的代码提交,但还是想把它们撤销

git reset --hard ORIG_HEAD

但是刚才这条命令在某些情况会很危险,如果你把一个已经被另一个分支合并的分支给删了,那么以后在合并相关的分支时会出错。

4.4、快速向前合并

还有一种需要特殊对待的情况,在前面没有提到。通常,一个合并会产生一个合并提交,把两个父分支里的每一行内容都合并进来。
但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的,每一个提交都已经存在另一个分支里了,git就会执行一个“快速向前”操作;git不创建任何新的提交,只是将当前分支指向合并进来的分支。

5、Git日志

5.1、查看日志

git log命令可以显示所有的提交。当然你也可以组合上面的命令选项;下面的命令就是找出所有从”v2.5”开始的fs目录下的所有Makefile的修改

git log v2.5.. Makefile fs/

git会根据git log命令的参数,按时间顺序显示相关的提交

5.2、日志统计

如果用–stat选项使用‘git log’,它会显示在每个提交中哪些文件被修改了,这些文件分别添加或删除了多少行内容。

git log --stat
5.3、格式化日志

你可以按你的要求来格式化日志输出。–pretty参数可以使用若干表现格式,如onelne

git log --pretty-oneline

或者你也可以使用short格式

git log --pretty=short

你也可用medium,full,email,raw。如果这些格式不完全符合你的要求,你也可以用–pretty=format参数,另一个有趣的事是:你可以用–graph选项来可视化你的提交图,它会用ASCII字符来画出一个很漂亮的提交历史线。

5.4、日志排序

你也可以把日志记录按一些不同的顺序来显示。注意,git日志从最近的提交开始,并且从这里开始向它们父分支回溯。然而git历史可能包括多个互不关联的开发线路,这样有时提交显示出来就有点杂乱。如果你要制定一个特定的顺序,可以为git log命令添加顺序参数。按默认情况,提交会按逆时间顺序显示。但是你也可以指定–topo-order参数,这就会让提交按拓扑顺序来显示(就是子提交在它们的父提交前显示)。如果你用git log命令按拓扑顺序来显示git仓库的提交日志,你会看到“开发线”都会集合在一起。

git log --pretty=format:'%h : %s' --topo-order --graph

你也可以用–data-order参数,这样显示提交日志的顺序主要按提交日期来排序。这个参数和–topo-order有一点像,没有父分支会在它们的子分支前显示,但是其它的东东还是按照时间来排序显示。你会看到“开发线”没有集合一起,它们会像并行开发一样跳来跳去

git log --pretty=format: '%h : %s' --date-order --graph

最后,你也可以用–reverser参数来逆向显示所有日志。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值