常用命令
git config:配置相关信息
git clone:复制仓库
git init:初始化仓库
git add:添加更新内容到索引中
git diff:比较内容
git status:获取当前项目状况
git commit:提交
git branch:分支相关
git checkout:切换分支
git merge:合并分支
git reset:恢复版本
git log:查看日志
Git配置
第一次使用Git的时候需要设置username and email,这就相当于展示自己身份(使用git config命令进行配置):
git config --global user.name "Cluas"
git config --global user.email "Cluas@live.cn"
如果你使用linux终端执行以上命令,就会在用户/home/#用户名 下新建一个叫做 .gitconfig 的文件 (注:隐藏文件,使用 ls -al 可以查看)。你会看到类型下面的内容,可以使用vim或者cat命令查看内容:
$ cat ~/.gitconfig
[user]
email = Cluas@live.cn
name = Cluas
以上文件被称为Git全局配置文件,一般配置方法为:
git config --globa l<配置名称> <配置值>
当然如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config命不带 --global选项来设置. 这会在你当前的项目目录下创建 .git/config,从而使用针对当前项目的配置。
获得一个Git仓库
一般来说,获取一个Git仓库的方式有两种:
1.通过git clone 命令克隆一个仓库到本地
(值得注意的是 Git能在多种Git能在许多协议下使用,所以Git URL可能以ssh://, http(s)://, git://. 有些仓库可以通过不只一种协议来访问)
#git clone 加上你要clone的仓库地址
#示例
git clone https://github.com/Cluas/Cluas.git
通过以上的操作,你会发现你的当前目录下会多一个叫做Cluas的文件夹,里面的内容就是我们刚克隆下来的代码。
2.通过初始化新建一个仓库
简单来说,初始化的过程就是把一个不想关的文件夹通过初始化命令使它置于Git版本控制管理之下。
创建代码目录 test:
$ cd /home/#用户名/
$ mkdir test
进入代码目录,创建并初始化Git仓库:
$ cd test
$ git init
Git会输出:
Initialized empty Git repository in /home/#用户名/test/.git/
通过ls -ls命令会发现test目录下会生出一个名叫.git目录的文件,这就表明已经初始化成功,有兴趣的话可以进入.git查看里面的内容。
工作流程
1.正常的工作流程
git的基本流程如下:
1.创建或修改文件
2.使用 git add 命令把新创建或者修改的文件添加到本地缓存区(Index)
3.使用git commit 命令提交到本地代码库
4.(可选,有的时候并没有可以同步的远端代码库)使用git push命令将本地代码库同步到远端代码库
进入我们刚才建立的test目录,分别创建文件file1,file2,file3:
$ cd test$ touch file1 file2 file3
修改文件,可以使用vim编辑内容,也可以直接echo添加测试内容。
$ echo "testcontent1" >> file1
$ echo "testcontent2" >> file2
$ echo "testcontent3" >> file3
此时可以使用git status
命令查看当前git仓库的状态:
$ git statusOn branch masterInitial commitUntracked files: (use "git
add <file>...") to include in what will be committed) file1 file2
file3nothing added to commit but untracked files present (use "git
add" to track)
可以发现,有三个文件处于untracked状态,下一步我们就需要用git add命令将他们加入到缓存区(Index)。使用git add命令将新建的文件添加到:
$ git add file1 file2 file3
然后再次执行git status
就会发现新的变化:
$ git statusOn branch masterInitial commitChanges to be
committed: (use "git rm --cached <file>..." to unstage) new file: file1
new file: file2 new file: file3
你现在为commit
做好了准备,你可以使用 git diff
命令再加上 --cached
参数,看看缓存区中哪些文件被修改了。进入到git diff --cached
界面后需要输入q
才可以退出:
$ git diff --cached
如果没有--cached
参数,git diff
会显示当前你所有已做的但没有加入到索引里的修改。
如果你要做进一步的修改, 那就继续做, 做完后就把新修改的文件加入到缓存区中。
当所有新建,修改的文件都被添加到了缓存区,我们就要使用git commit
提交到本地仓库:
$ git commit -m "add 3 files"
需要使用-m
添加本次修改的注释,完成后就会记录一个新的项目版本。除了用git add
命令,我们还可以用下面的命令将所有没有加到缓存区的修改也一起提交,但-a命令不会添加新建的文件。
$ git commit -a -m "add 3 files"
再次输入git status
查看状态,会发现当前的代码库已经没有待提交的文件了,缓存区已经被清空。
至此,我们完成了第一次代码提交,这次提交的代码中我们创建了三个新文件。需要注意的是如果是修改文件,也需要使用git add命令添加到缓存区才可以提交。如果是删除文件,则直接使用git rm命令删除后会自动将已删除文件的信息添加到缓存区,git commit提交后就会将本地仓库中的对应文件删除。
这个时候如果本地的仓库连接到了远程Git服务器,可以使用下面的命令将本地仓库同步到远端服务器:
$ git push origin master
这时候可能需要你输入在Git服务器上的用户名和密码。
分支和合并
1.分支
一个Git仓库可以维护很多开发分支。现在我们来创建一个新的交experimental的分支:
$git branch experimental
运行 git branch 命令可以查看当前的分支列表, 以及目前的开发环境处于哪个分支上:
$ git branch
experimental
* master
experimental分支是你刚才创建的,master分支是Git系统默认创建的主分支。*号标识了你当前工作在哪个分支下,输入git checkout 分支名 可以切换到其他分支:
$ git checkout experimental
Switched to branch 'experimental'
切换到experimental
分支,切换完成后,先编辑里面的一个文件,再提交(commit)改动,最后切换回 “master”分支:
# 修改文件file1
$ echo "update" >> file1# 查看当前状态
$ git status# 添加并提交file1的修改$ git add file1
$ git commit -m "update file1"# 查看file1的内容
$ cat file1testupdate# 切换到master分支
$ git checkout master
查看file1中的内容会发现刚才做的修改已经看不见了。因为刚才修改是在分支experimental下,现在切换回master主分支了,此时目录下的文件都是master分支上的文件。
现在在master分支下再做一些不同的修改:
#修改文件file2
$echo "update again" >> file2
#查看当前状态
$git status
#添加并提交file2的修改
$gie add file2
$git commit -m "update file2 on master"
#查看file2的内容
$cat file2
test
update again
这时,两个分支就有了各自不同的修改,分支的内容都已经不同,如何将多个分支进行合并呢?
可以通过下面的git merge 命令来合并experimental 到主线分支master:
#切换到master分支
$git checkout master
#将experimental分支合并到master
$git merge - m 'merge experimental branch' experimental
-m 参数仍然是需要填写合并的备注信息。
由于两个baranch修改两个不同的文件,所以合并时不会有冲突,执行上面的命令后合并就完成了。
如果有冲突,比如两个分支都修改了一个文件file3,则合并时会失败。首先我们在master分支上修改file3文件并提交:
&git checkout master
$echo "master:update file3 on master
然后切换到experimental,修改flie3并提交:
$git checkout experimental
$echo "experimental :update file3 on experimental" >>file3
$git commit -a -m 'update file3 on experimental'
切换到master进行合并:
$git checkout master
$git merge experimental
Auto-merging file3
CONFLICT (content): Merge conflict in file3
Automatic merge failed; fix conflicts and then commit the result.
合并失败后先用git status查看状态,会发现file3显示为both modified,查看file3内容会发现:
$ cat file3
test
<<<<<<< HEAD
master: update file3
=======experimental: update file3
>>>>>>> experimental
上面的内容也可以使用git diff
查看,先前已经提到git diff
不加参数可以显示未提交到缓存区中的修改内容。
可以看到冲突的内容都被添加到了file3中,我们使用vim编辑这个文件,去掉git自动产生标志冲突的<<<<<<
等符号后,根据需要只保留我们需要的内容后保存,然后使用git add file3
和git commit
命令来提交合并后的file3内容,这个过程是手动解决冲突的流程。
编辑冲突文件$ vim file3# 提交修改后的文件$ git add file3$ git commit -m 'merge file3'
当我们完成合并后,不再需要experimental
时,可以使用下面的命令删除:
$ git branch -d experimental
git branch -d
只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D
2.撒销一个合并
如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:
$ git reset --hard HEAD^# 查看file3的内容,已经恢复到合并前的master上的文件内容$ cat file3
3.快速向前合并
还有一种需要特殊对待的情况,在前面没有提到。通常,一个合并会产生一个合并提交(commit), 把两个父分支里的每一行内容都合并进来。
但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交(commit)都已经存在另一个分支里了,git 就会执行一个“快速向前"(fast forward)操作;git 不创建任何新的提交(commit),只是将当前分支指向合并进来的分支。
六、Git日志
1.查看日志
git log命令可以显示所有的提交(commit):
$ git log
如果提交的历史纪录很长,回车会逐步显示,输入q
可以退出。
git log
有很多选项,可以使用git help log
查看,例如下面的命令就是找出所有从"v2.5“开始在fs目录下的所有Makefile的修改:
$ git log v2.5.. Makefile fs/
Git会根据git log命令的参数,按时间顺序显示相关的提交(commit)。
2.日志统计
如果用--stat选项使用'git log',它会显示在每个提交(commit)中哪些文件被修改了, 这些文件分别添加或删除了多少行内容,这个命令相当于打印详细的提交记录:
$ git log --stat
3.格式化日志
你可以按你的要求来格式化日志输出。--pretty
参数可以使用若干表现格式,如oneline
:
$ git log --pretty=oneline
或者你也可以使用 short
格式:
$ git log --pretty=short
你也可用medium
,full
,fuller
,email
或raw
。 如果这些格式不完全符合你的相求, 你也可以用--pretty=format
参数定义格式。
--graph
选项可以可视化你的提交图(commit graph),会用ASCII字符来画出一个很漂亮的提交历史(commit history)线:
$ git log --graph --pretty=oneline
4.日志排序
日志记录可以按不同的顺序来显示。如果你要指定一个特定的顺序,可以为git log
命令添加顺序参数。
按默认情况,提交会按逆时间顺序显示,可以指定--topo-order
参数,让提交按拓扑顺序来显示(就是子提交在它们的父提交前显
示):
$ git log --pretty=format:'%h : %s' --topo-order --graph
你也可以用 --reverse
参数来逆向显示所有提交日志。
中级技能:!
忽略某些文件
方法: 在顶层工作目录中添加一个.gitignore 的文件
: 以'#' 开始的行,被视为注释。 忽略掉所有文件名是 foo.txt 的文件。
foo.txt
忽略所有生成的 html 文件。
*.html
foo.html是手工维护的,所以例外。
!foo.html
忽略所有.o 和 .a文件。
*.[oa]
网友评论