本文参考:猴子都能懂的GIT
一、Git基础操作
1. 安装Git
本文按照命令行方式来安装和使用git,如需windows的GUI可以使用tortoisegit。
- windows安装方式:http://git-scm.com/
- liunx安装:
yum install -y git
2. 初期设定
安装Git之后,请输入您的用户名和电子邮件地址。该设置操作在安装Git后进行一次就够了。这些信息将作为提交者信息显示在更新历史中。
Git的设定被存放在用户本地目录的.gitconfig档案里。虽然可以直接编辑配置文件,但在这个教程里我们使用config命令。
1
2
|
git config --global user.name "<用户名>"
git config --global user.email "<电子邮件>"
|
以下命令能让Git以彩色显示:
1
|
git config --global color.ui auto
|
可以为Git命令设定别名。例如:把「checkout」缩略为「co」,然后就使用「co」来执行命令。
1
|
git config --global alias.co checkout
|
Windows问题解决
- 报错
LF will be replaced by CRLF in xxxx. The file will have its original line endings in your working directory.
原理:
CRLF – Carriage-Return Line-Feed 回车换行
就是回车(CR, ASCII 13, \r) 换行(LF, ASCII 10, \n)。
这两个ACSII字符不会在屏幕有任何输出,但在Windows中广泛使用来标识一行的结束。
而在Linux/UNIX系统中只有换行符。
也就是说在windows中的换行符为 CRLF, 而在linux下的换行符为:LF
使用git来生成一个rails工程后,文件中的换行符为LF, 当执行git add .时,系统提示:LF 将被转换成 CRLF
1
|
git config core.autocrlf false //禁用自动转换
|
- 如果如果在Windows使用命令行 (Git Bash), 含非ASCII字符的文件名会显示为 “\346\226\260\350\246…"。若设定如下,就可以让含非ASCII字符的文件名正确显示了。
1
|
git config --global core.quotepath off
|
- 若在Windows使用命令行,您只能输入ASCII字符。所以,如果您的提交信息包含非ASCII字符,请不要使用-m选项,而要用外部编辑器输入。
外部编辑器必须能与字符编码UTF-8和换行码LF兼容。
1
|
git config --global core.editor "\"[使用编辑区的路径]\""
|
3. 新建本地数据库
接下来要在本地新建数据库,创建一个名称为「tutorial」的空目录,并把它放在Git管理之下。
下面将以这个目录进行教程讲解。
首先在任意一个地方创建tutorial目录。然后使用init命令把该tutorial目录移动到本地Git数据库。
按照以下步骤把新创建的tutorial目录设置到Git数据库。
1
2
3
4
|
$ mkdir tutorial
$ cd tutorial
$ git init
Initialized empty Git repository in /Users/yourname/Desktop/tutorial/.git/
|
4. 提交文件
在tutorial目录新建一个文件,然后将文件添加到数据库。
首先在tutorial目录里新建一个名为「sample.txt」的文本文件,请在文件中输入以下的内容:
请使用status命令确认工作树和索引的状态。
执行status命令以确认tutorial目录的状态。
1
2
3
4
5
6
7
8
9
10
|
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# sample.txt
nothing added to commit but untracked files present (use "git add" to track)
|
从status响应我们可以看到‘sample.txt’目前不是历史记录对象。请首先把‘sample.txt’加入到索引,就可以追踪它的变更了。
将文件加入到索引,要使用add命令。在指定加入索引的文件。用空格分割可以指定多个文件。
tips
指定参数「.」,可以把所有的文件加入到索引。
现在,我们把sample.txt加入到索引然后确认一下。
1
2
3
4
5
6
7
8
9
10
11
|
$ git add sample.txt
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: sample.txt
#
|
既然sample.txt已加入到索引,我们就可以提交文件了。请执行如下显示的commit命令。
执行commit命令之后确认状态。
1
2
3
4
5
6
7
8
|
$ git commit -m "first commit"
[master (root-commit) 116a286] first commit
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 sample.txt
$ git status
# On branch master
nothing to commit (working directory clean)
|
从status响应我们可以看到没有新的变更要提交。
使用log命令,我们可以在数据库的提交记录看到新的提交。
1
2
3
4
5
6
|
$ git log
commit ac56e474afbbe1eab9ebce5b3ab48ac4c73ad60e
Author: eguchi <eguchi@nulab.co.jp>
Date: Thu Jul 12 18:00:21 2012 +0900
first commit
|
二、共享数据库(远程仓库)
1. 创建共享数据库(远程仓库)
在GitHub或服务器中创建git数据库,比较简单此处不做演示
2. push到远程数据库
向远程数据库推送本地数据库的修改记录吧。
给远程数据库取别名
您可以给远程数据库取一个别名。这样,下次推送的时候就不需要输入长串的远程数据库地址了。在这个教程里,我们的远程数据库命名为“origin”。
请使用remote指令添加远程数据库。在处输入远程数据库名称,在处指定远程数据库的URL。
1
|
git remote add <name> <url>
|
通过运行以下指令,将创建于上一个页面的远程数据库的URL命名为“origin”。
1
|
$ git remote add origin https://[your_space_id].backlogtool.com/git/[your_project_key]/tutorial.git
|
执行推送或者拉取的时候,如果省略了远程数据库的名称,则默认使用名为”origin“的远程数据库。因此一般都会把远程数据库命名为origin。
push操作
GitHub仓库在push前,需要在GitHub中对本地数据库所在主机进行授权
使用push命令向数据库推送更改内容。< repository >处输入目标数据库地址或者远程数据库别名,< refspec >处指定推送的分支。我们将在高级篇详细地对分支进行说明。
1
|
git push <repository> <refspec>...
|
运行以下命令便可向远程数据库‘origin’进行推送。当执行命令时,如果您指定了-u选项,那么下一次推送时就可以省略分支名称了。但是,首次运行指令向空的远程数据库推送时,必须指定远程数据库名称和分支名称。
1
2
3
4
5
6
7
8
|
$ git push -u origin master
Username: <用户名>
Password: <密码>
Counting objects: 3, done.
Writing objects: 100% (3/3), 245 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://nulab.backlog.jp/git/BLG/tutorial.git
* [new branch] master -> master
|
3. 克隆远程数据库
快试试克隆远程数据库吧,这样您在别的地方也可以工作了。
使用clone指令可以复制数据库,在< repository >指定远程数据库的URL,
在< directory >指定新目录的名称。
1
|
git clone <repository> <directory>
|
执行以下指令后,会在目录(tutorial2) 复制远程数据库。
1
2
3
4
5
6
7
|
$ git clone https://nulab.backlog.jp/git/BLG/tutorial.git tutorial2
Cloning into 'tutorial2'...
Username: <用户名>
Password: <密码>
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
|
若要验证克隆是否成功,请看在复制的目录“tutorial2”中的sample.txt是否含有以下文字。
4. 从克隆的数据库进行push
首先,在之前克隆的数据库目录里的sample.txt 添加以下黑体字,并提交。
1
2
|
连猴子都懂的Git命令
add 把变更录入到索引中
|
1
2
3
4
|
$ git add sample.txt
$ git commit -m "添加add的说明"
[master 1ef5c8c] 添加add的说明
1 files changed, 1 insertions(+), 1 deletions(-)
|
用tutorial2进行的操作
然后,推送此次变更,更新远程数据库。
当在克隆的数据库目录执行推送时,您可以省略数据库和分支名称。
1
2
3
4
5
6
7
8
9
10
|
$ git push
Username: <用户名>
Password: <密码>
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 351 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://nulab.backlog.jp/git/BLG/tutorial.git
486789c..1ef5c8c master -> master
|
5. 从远程数据库pull
试试从远程数据库把最新变更内容拉取到tutorial吧。
我们把在上一页面中从“tutorial2”推送到远程数据库的内容拉取到数据库目录“tutorial”吧。
使用pull指令进行拉取操作。省略数据库名称的话,会在名为origin的数据库进行pull。
1
|
$ git pull <repository> <refspec>...
|
用tutorial进行的操作
1
2
3
4
5
6
7
8
9
|
$ git pull origin master
Username: <用户名>
Password: <密码>
From https://nulab.backlog.jp/git/BLG/tutorial
* branch master -> FETCH_HEAD
Updating ac56e47..3da09c1
Fast-forward
sample.txt | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
|
sample.txt文档的内容已更新。
二、 整合修改记录
1. push冲突的状态
现在,我们将要学习怎样解决冲突。
首先,我们用“tutorial”和“tutorial2”制造一个冲突状态。
用tutorial进行的操作
首先,打开tutorial目录的sample.txt文档,添加以下黑体字之后进行提交。
1
2
3
|
连猴子都懂的Git命令
add 把变更录入到索引中
commit 记录索引的状态
|
1
2
3
4
|
$ git add sample.txt
$ git commit -m "添加commit的说明"
[master 95f15c9] 添加commit的说明
1 files changed, 1 insertions(+), 0 deletions(-)
|
用tutorial2进行的操作
接下来,打开tutorial2目录的sample.txt文档,添加以下黑体字之后进行提交。
1
2
3
|
连猴子都懂的Git命令
add 把变更录入到索引中
pull 取得远端数据库的内容
|
1
2
3
4
|
$ git add sample.txt
$ git commit -m "添加pull的说明"
[master 4c01823] 添加pull的说明
1 files changed, 1 insertions(+), 0 deletions(-)
|
用tutorial2进行的操作
现在从tutorial2 推送内容到远程数据库。
1
2
3
4
5
6
7
8
9
10
|
$ git push
Username: <用户名>
Password: <密码>
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 391 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://nulab.backlog.jp/git/BLG/tutorial.git
3da09c1..4c01823 master -> master
|
用tutorial进行的操作
现在从tutorial推送内容到远程数据库吧。
1
2
3
4
5
6
7
8
9
|
$ git push
Username: <用户名>
Password: <密码>
To https://nulab.backlog.jp/git/BLG/tutorial.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://nulab.backlog.jp/git/BLG/tutorial.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of 'git push --help' for details.
|
2. 解决冲突
为了把变更内容推送到远程数据库,我们必须手动解决冲突。首先请运行pull,以从远程数据库取得最新的变更记录吧。
用tutorial进行的操作
请执行以下指令。
1
2
3
4
5
6
7
8
9
10
11
12
|
$ git pull origin master
Username: <用户名>
Password: <密码>
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://nulab.backlog.jp/git/BLG/tutorial
* branch master -> FETCH_HEAD
Auto-merging sample.txt
CONFLICT (content): Merge conflict in sample.txt
Automatic merge failed; fix conflicts and then commit the result.
|
用tutorial进行的操作
讯息显示「Merge conflict in sample.txt」。请打开sample.txt文件,我们看到Git已添加标示以显示冲突部分。请为Git无法完成主动合并的部分做以下的修改。
1
2
3
4
5
6
7
|
连猴子都懂的Git命令
add 把变更录入到索引中
<<<<<<< HEAD
commit 记录索引的状态
=======
pull 取得远端数据库的内容
>>>>>>> 4c0182374230cd6eaa93b30049ef2386264fe12a
|
用tutorial进行的操作
导入两方的修改,并删除多余的标示行以解决冲突。
1
2
3
4
|
连猴子都懂的Git命令
add 把变更录入到索引中
commit 记录索引的状态
pull 取得远端数据库的内容
|
用tutorial进行的操作
文件的内容发生了修改,所以需要进行提交。
1
2
3
|
$ git add sample.txt
$ git commit -m "合并"
[master d845b81] 合并
|
这样就完成了从远程数据库导入最新的修改内容。
用tutorial进行的操作
我们可以用log命令来确认数据库的历史记录是否准确。指定–graph选项,能以文本形式显示更新记录的流程图。指定–oneline选项,能在一行中显示提交的信息。
1
2
3
4
5
6
7
8
|
$ git log --graph --oneline
* d845b81 合并
|\
| * 4c01823 添加pull的说明
* | 95f15c9 添加commit的说明
|/
* 3da09c1 添加add的说明
* ac56e47 first commit
|
这表明两个修改记录已经整合了。
这时候,之前被拒绝的push应该可以通过了,push一下看看吧。
辛苦了!Git的基本使用方法的说明到这里就告一段落了。有关分支以及修改等更高阶的内容,请参见高级篇!