操作系统

当前位置:金沙棋牌 > 操作系统 > git学习笔记,小白专供版金沙棋牌

git学习笔记,小白专供版金沙棋牌

来源:http://www.logblo.com 作者:金沙棋牌 时间:2019-11-29 22:24

初始化git

免费而超级好用的Git不能不了解!小楼给大家带来Git入门手册,教你用好Git,做个合格的程序猿!ง

  • 本课程为实验楼免费教程,想动手实操的朋友可以直接移步实验楼Git实战教程实验,边学边练!
  • 本教程分多期为大家更新,请大家Mark并收藏好每一期的内容方便学习!
  • 本课程为《Git Community Book 中文版》提供配套实验,汇聚了Git社区的很多精华, 帮助你尽快的掌握Git!

本节实验为 Git 入门第一个实验,可以帮助大家熟悉如何创建和使用 git 仓库。

在使用git进行代码管理之前,我们首先要对git进行初始化。

1.Git 配置使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名,每次提交记录里都会包含这些信息。使用git config命令进行配置:

$ git config --global user.name "Scott Chacon"$ git config --global user.email "schacon@gmail.com"

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

$ cat ~/.gitconfig[user] email = schacon@gmail.com name = Scott Chacon

上面的配置文件就是Git全局配置的文件,一般配置方法是git config --global <配置名称> <配置的值>。

如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config 命令不带 --global 选项来设置. 这会在你当前的项目目录下创建 .git/config,从而使用针对当前项目的配置。

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

1.Clone一个仓库为了得到一个项目的拷贝,我们需要知道这个项目仓库的地址. Git能在许多协议下使用,所以Git URL可能以ssh://, http://, git://. 有些仓库可以通过不只一种协议来访问。

我们在github.com上提供了一个名字为gitproject的供大家测试的公有仓库,这个仓库可以使用下面方式进行clone:

$ git clone https://github.com/shiyanlou/gitproject

clone操作完成后,会发现当前目录下多了一个gitproject文件夹,这个文件夹里的内容就是我们刚刚clone下来的代码。由于当前`gitproject仅是测试项目,里面仅有一个README.md文件。

$ cd gitproject/$ ls README.md

细心的同学可以发现在命令提示符$前面多了个。这是由于实验楼的Linux使用的是zsh Shell,zsh会判断当前的目录是否有Git仓库,如果是的话则自动把目前所在的git分支显示在提示符中。Git 分支的概念我们会在稍后介绍。

2.初始化一个新的仓库可以对一个已存在的文件夹用下面的命令让它置于Git的版本控制管理之下。

创建代码目录project:

$ cd /home/shiyanlou/$ mkdir project

进入到代码目录,创建并初始化Git仓库:

$ cd project$ git init

Git会输出:

Initialized empty Git repository in /home/shiyanlou/project/.git/

通过ls -la命令会发现project目录下会有一个名叫.git 的目录被创建,这意味着一个仓库被初始化了。可以进入到.git目录查看下有哪些内容。

  1. 正常的工作流程git的基本流程如下:

创建或修改文件使用git add命令添加新创建或修改的文件到本地的缓存区使用git commit命令提交到本地代码库(可选,有的时候并没有可以同步的远端代码库)使用git push命令将本地代码库同步到远端代码库进入我们刚才建立的project目录,分别创建文件file1,file2,file3:

$ cd project$ touch file1 file2 file3

修改文件,可以使用vim编辑内容,也可以直接echo添加测试内容。

$ echo "test" >> file1$ echo "test" >> file2$ echo "test" >> 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命令将他们加入到缓存区。

使用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 remote 命令,不同于刚刚的 git clone 命令,直接将远端的仓库克隆下来。 我们当前的仓库是使用 git init 初始化的本地仓库,所以我们需要将本地仓库与远程仓库关联,使用如下命令(需要修改下面的远程仓库地址为自己的仓库地址):

git remote add origin https://github.com/yingque/novel_insect.git

对于上述命令而言,git remote add 命令用于添加远程主机,origin 是主机名,此处我们可以自定义,不一定非要使用 origin,而 需要替换为自己的远程仓库地址

这个时候如果本地的仓库连接到了远程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 experimentalSwitched to branch 'experimental'

切换到experimental分支,切换完成后,先编辑里面的一个文件,再提交改动,最后切换回 “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的修改$ git add file2$ git commit -m "update file2 on master"# 查看file2的内容$ cat file2testupdate again

这时,两个分支就有了各自不同的修改,分支的内容都已经不同,如何将多个分支进行合并呢?

可以通过下面的git merge命令来合并experimental到主线分支master:

# 切换到master分支$ git checkout master# 将experimental分支合并到master$ git merge -m 'merge experimental branch' experimental-m参数仍然是需要填写合并的注释信息。

由于两个branch修改了两个不同的文件,所以合并时不会有冲突,执行上面的命令后合并就完成了。

如果有冲突,比如两个分支都改了一个文件file3,则合并时会失败。首先我们在master分支上修改file3文件并提交:

# 切换到master分支$ git checkout master# 修改file3文件$ echo "master: update file3" >> file3# 提交到master分支$ git commit -a -m 'update file3 on master'

然后切换到experimental,修改file3并提交:

# 切换到experimental分支$ git checkout experimental# 修改file3文件$ echo "experimental: update file3" >> file3# 提交到experimental分支$ git commit -a -m 'update file3 on experimental'

切换到master进行合并:

$ git checkout master$ git merge experimentalAuto-merging file3CONFLICT : Merge conflict in file3Automatic merge failed; fix conflicts and then commit the result.

合并失败后先用git status查看状态,会发现file3显示为both modified,查看file3内容会发现:

$ cat file3test<<<<<<< HEADmaster: 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

  1. 撤销一个合并如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:
$ git reset --hard HEAD^# 查看file3的内容,已经恢复到合并前的master上的文件内容$ cat file3

3.快速向前合并还有一种需要特殊对待的情况,在前面没有提到。通常,一个合并会产生一个合并提交, 把两个父分支里的每一行内容都合并进来。

但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交都已经存在另一个分支里了,git 就会执行一个“快速向前"(fast forward)操作;git 不创建任何新的提交,只是将当前分支指向合并进来的分支。

1.查看日志git log命令可以显示所有的提交:

$ git log

如果提交的历史纪录很长,回车会逐步显示,输入q可以退出。

git log有很多选项,可以使用git help log查看,例如下面的命令就是找出所有从"v2.5“开始在fs目录下的所有Makefile的修改:

$ git log v2.5.. Makefile fs/

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

2.日志统计如果用--stat选项使用'git log',它会显示在每个提交中哪些文件被修改了, 这些文件分别添加或删除了多少行内容,这个命令相当于打印详细的提交记录:

$ 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参数来逆向显示所有提交日志。

本节讲解了几个基本命令:

  • git config:配置相关信息
  • git clone:复制仓库
  • git init:初始化仓库
  • git add:添加更新内容到索引中
  • git diff:比较内容
  • git status:获取当前项目状况
  • git commit:提交
  • git branch:分支相关
  • git checkout:切换分支
  • git merge:合并分支
  • git reset:恢复版本
  • git log:查看日志

本期课程结束啦,光说不练假把式。建议大家开通GitHub账号,创建练习仓库并练习一遍上述所讲的内容才能更好的巩固所学的知识点。下一期,敬请关注!ノ

传送门:

往期回顾: 下期预告:

金沙棋牌 1金沙棋牌 2

常用命令

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的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名,每次提交记录里都会包含这些信息。使用git config命令进行配置
[root@bogon ~]# git config --global user.name "xiangcl"
[root@bogon ~]# git config --global user.email "xiangcl_cs@qq.com"
  • 执行了上面的命令后,会在家目录(/root)下建立一个叫.gitconfig的文件(该文件为隐藏文件,需要使用ls -al查看到). 内容一般像下面这样,可以使用vim或cat查看文件内容:
[root@bogon ~]# cat .gitconfig
[user]
name = xiangcl
email = xiangcl_cs@qq.com
  • 上面的配置文件就是Git全局配置的文件,一般配置方法是git config --global <配置名称> <配置的值>

  • 如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config命令不带--global选项来设置. 这会在你当前的项目目录下创建.git/config,从而使用针对当前项目的配置。

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,从而使用针对当前项目的配置。

金沙棋牌,配置GitHub

获得一个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查看里面的内容。

注册GitHub

后续有时间另写一篇教程,这里不在赘述...

工作流程

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服务器上的用户名和密码。

配置Git

  • 在本地创建ssh key:
ubuntu@VM-0-26-ubuntu:~$ sudo ssh-keygen -t rsa -C "xiangcl_cs@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Ia1lou/M0ZNnLW6Dly9+Ws1kX89Uq5eF9wUBgFGChDA xiangcl_cs@qq.com
The key's randomart image is:
+---[RSA 2048]----+
|  E. o..o+o....  |
|   .. ....     . |
|      o =     . .|
|     . * .     oo|
|    . . S     +.*|
|     . . . . =.=B|
|      o +.+.o.oo=|
|     + ..=*o. .  |
|      +  ++*.    |
+----[SHA256]-----+

显示如上则表示创建成功。注意,上面命令中的邮箱"xiangcl_cs@qq.com"请更换为自己的邮箱,后面密钥设置密码,这里我无需设置,直接一路回车就行。

  • 设置成功会在 /root/ 下生成一个.ssh文件,因为要进入 /root 目录,所以需要转为root身份:
ubuntu@VM-0-26-ubuntu:~$ sudo -s
root@VM-0-26-ubuntu:~# cd /root
root@VM-0-26-ubuntu:/root# cd .ssh/
root@VM-0-26-ubuntu:/root/.ssh# ls -l
total 8
-rw------- 1 root root 1675 May 18 16:14 id_rsa
-rw-r--r-- 1 root root  399 May 18 16:14 id_rsa.pub
  • 打开id_rsa.pub,复制里面的key
  • 然后粘贴至GitHub,Settings/SSH and GPG keys/New SSH key
  • 使用 ssh -T git@github.com 验证是否安装成功
root@VM-0-26-ubuntu:~# ssh -T git@github.com
The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.112' (RSA) to the list of known hosts.
Hi xiangcl! You've successfully authenticated, but GitHub does not provide shell access.

按提示输入yes,看到You've successfully authenticated, but GitHub does not provide shell access则表示连接成功。

分支和合并

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内容,这个过程是手动解决冲突的流程。

获取一个Git仓库

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

编辑冲突文件$ 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]

Clone一个仓库

  • 为了得一个项目的拷贝(copy),我们需要知道这个项目仓库的地址(Git URL). Git能在许多协议下使用,所以Git URL可能以ssh://, http(s)://, git://. 有些仓库可以通过不只一种协议来访问。

  • 这里在我的GitHub上提供的一个名字为GitTest的仓库供大家测试的公有仓库,这个仓库可以使用下面方式进行clone:

[root@bogon ~]# git clone https://github.com/xiangcl/GitTest.git
正克隆到 'GitTest'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
  • clone操作完成后,会发现当前目录下多了一个GitTest的文件夹,这个文件夹里的内容就是我们刚刚clone下来的代码。由于当前GitTest仅是测试项目,里面仅有README.md和LICENSE文件。
[root@bogon ~]# cd GitTest/
[root@bogon GitTest]# ls
LICENSE  README.md

初始化一个新仓库

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

  • 创建代码目录project:
[root@bogon gitproject]# cd ~

[root@bogon ~]# mkdir project
  • 进入到代码目录,创建并初始化Git仓库:
[root@bogon ~]# cd project/

[root@bogon project]# git init

初始化空的 Git 版本库于 /root/project/.git/

通过ls -la命令会发现project目录下会有一个名叫.git的目录被创建,这意味着一个仓库被初始化了。可以进入到.git目录查看下有哪些内容。

Git工作流程

git基本工作流程如下:

  1. 创建或修改文件
  2. 使用git add命令添加新创建或修改的文件到本地的缓存区(Index)
  3. 使用git commit命令提交到本地代码库
  4. (可选,有的时候并没有可以同步的远端代码库)使用git push命令将本地代码库同步到远端代码库
  • 进入我们刚才建立的project目录,分别创建文件file1,file2,file3
[root@bogon ~]# cd project/

[root@bogon project]# touch file1 file2 file3
  • 修改文件,可以使用vim编辑内容,也可以直接echo添加测试内容。
[root@bogon project]# echo "test" >> file1

[root@bogon project]# echo "test" >> file2

[root@bogon project]# echo "test" >> file3
  • 此时可以使用git status命令查看当前git仓库的状态:
[root@bogon project]# git status

# 位于分支 master

#

# 初始提交

#

# 未跟踪的文件:

# (使用 "git add <file>..." 以包含要提交的内容)

#

# file1

# file2

# file3

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

可以发现,有三个文件处于未跟踪(untracked)状态,下一步我们就需要用git add命令将他们加入到缓存区(Index)。

  • 使用git add命令将新建的文件添加到:
[root@bogon project]# git add file1 file2 file3
  • 然后再次执行git status就会发现新的变化:
[root@bogon project]# git status

# 位于分支 master

#

# 初始提交

#

# 要提交的变更:

# (使用 "git rm --cached <file>..." 撤出暂存区)

#

# 新文件: file1

# 新文件: file2

# 新文件: file3

#
  • 你现在为commit做好了准备,你可以使用 git diff 命令再加上 --cached 参数,看看缓存区中哪些文件被修改了。
[root@bogon project]# git diff --cached

如果没有--cached参数,git diff 会显示当前你所有已做的但没有加入到索引里的修改。

如果你要做进一步的修改, 那就继续做, 做完后就把新修改的文件加入到缓存区中。

  • 当所有新建,修改的文件都被添加到了缓存区,我们就要使用git commit提交到本地仓库:
[root@bogon project]# git commit -m "add 3 files"

[master(根提交) bbb9a52] add 3 files

 3 files changed, 3 insertions(+)

 create mode 100644 file1

 create mode 100644 file2

 create mode 100644 file3

需要使用-m添加本次修改的注释,完成后就会记录一个新的项目版本。

  • 除了用git add命令,我们还可以用下面的命令将所有没有加到缓存区的修改也一起提交,但-a命令不会添加新建的文件。
$ git commit -a -m "add 3 files"

再次输入git status查看状态,会发现当前的代码库已经没有待提交的文件了,缓存区已经被清空。

至此,我们完成了第一次代码提交,这次提交的代码中我们创建了三个新文件。需要注意的是如果是修改文件,也需要使用git add命令添加到缓存区才可以提交。如果是删除文件,则直接使用git rm命令删除后会自动将已删除文件的信息添加到缓存区,git commit提交后就会将本地仓库中的对应文件删除。

为你的项目添加一个新的远程仓库

本地仓库是创建完成了,现在需要与远程的仓库进行链接。

[root@bogon project]# git remote
[root@bogon project]# git remote add origin git@github.com:xiangcl/project.git
[root@bogon project]# git remote -v
origin  git@github.com:xiangcl/project.git (fetch)
origin  git@github.com:xiangcl/project.git (push)

推送到远程仓库

这个时候如果本地的仓库连接到了远程Git服务器,可以使用下面的命令将本地仓库同步到远端服务器:(注意,需要与远程仓库连接)

[root@bogon project]# git push -u origin master
Warning: Permanently added the RSA host key for IP address '192.30.255.113' to the list of known hosts.
Counting objects: 14, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (14/14), 1.16 KiB | 0 bytes/s, done.
Total 14 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), done.
To git@github.com:xiangcl/project.git
 * [new branch]      master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。

上面使用git push时带上了-u参数,是将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。

从远端仓库下载新分支与数据

  • git fetch会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
[root@bogon project]# git remote -v
origin  git@github.com:xiangcl/project.git (fetch)
origin  git@github.com:xiangcl/project.git (push)
[root@bogon project]# git fetch origin 
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
来自 github.com:xiangcl/project
   6c3b072..4d38d99  master     -> origin/master

git fetch origin会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。

  • 查看分支

git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。

[root@bogon project]# git branch -r 
  origin/master

[root@bogon project]# git branch -a
* master
  remotes/origin/master

上面命令表示,本地主机的当前分支是master,远程分支是origin/master。

  • 取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。
[root@bogon project]# git checkout -b newBrack origin/master 
分支 newBrack 设置为跟踪来自 origin 的远程分支 master。
切换到一个新分支 'newBrack'

上面命令表示,在origin/master的基础上,创建一个新分支。

  • 此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。
[root@bogon project]# git merge origin/master 
Already up-to-date.

[root@bogon project]# ls
file1  file2  file3  README.md

上面命令表示在当前分支上,合并origin/master。此时使用ls就可以查看到我刚刚在仓库段创建的README.md文件了

分支与合并

Git的分支可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线。分支的作用体现在多人协作开发中,比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,而其他同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。

分支

  • 一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫 experimental的分支:
[root@bogon project]# git branch experimental
  • 运行git branch命令可以查看当前的分支列表,已经目前的开发环境处在哪个分支上:
[root@bogon project]# git branch
  experimental
* master
  • experimental 分支是你刚才创建的,master分支是Git系统默认创建的主分支。星号标识了你当工作在哪个分支下,输入git checkout 分支名可以切换到其他分支:
[root@bogon project]# git checkout experimental
切换到分支 'experimental'
  • 切换到experimental分支,切换完成后,先编辑里面的一个文件,再提交(commit)改动,最后切换回 “master”分支:
[root@bogon project]# echo "update" >> file1 # 修改file1文件
[root@bogon project]# git status # 使用 git status 查看当前状态
# 位于分支 experimental
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: file1
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@bogon project]# git add file1 # 添加并提交file1的更改
[root@bogon project]# git commit -m "update file1"
[experimental 3251fbe] update file1
 1 file changed, 1 insertion(+)
[root@bogon project]# cat file1 #查看file1文件的内容
test
update
[root@bogon project]# git checkout master #切换至master分支

切换到分支 'master'

查看下file1中的内容会发现刚才做的修改已经看不到了。因为刚才的修改时在experimental分支下,现在切换回了master分支,目录下的文件都是master分支上的文件了。

  • 现在可以在master分支下再作一些不同的修改:
[root@bogon project]# echo 'update again' >> file2 #修改file2文件

[root@bogon project]# git status #查看当前状态

# 位于分支 master

# 尚未暂存以备提交的变更:

# (使用 "git add <file>..." 更新要提交的内容)

# (使用 "git checkout -- <file>..." 丢弃工作区的改动)

#

# 修改: file2

#

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

[root@bogon project]# git add file2 #添加并调教file2的修改

[root@bogon project]# git commit -m "update file2 on master"

[master 7f50340] update file2 on master

 1 file changed, 1 insertion(+)

[root@bogon project]# cat file2 #查看file2的修改

test

update again

这时,两个分支就有了各自不同的修改,分支的内容都已经不同,如何将多个分支进行合并呢?

  • 可以通过下面的git merge命令来合并experimental到主线分支master:
[root@bogon project]# git checkout master # 切换至master 分支

已经位于 'master'

[root@bogon project]# git merge -m "merge experimental branch" experimental #将 experimental 分支合并至master分区

Merge made by the 'recursive' strategy.

 file1 | 1 +

 1 file changed, 1 insertion(+)

-m参数仍然是需要填写合并的注释信息。

由于两个branch修改了两个不同的文件,所以合并时不会有冲突,执行上面的命令后合并就完成了。

  • 如果有冲突,比如两个分支都改了一个文件file3,则合并时会失败。首先我们在master分支上修改file3文件并提交:
[root@bogon project]# git checkout master # 切换至 master 分区

已经位于 'master'

[root@bogon project]# echo "master:update file3" >> file3 # 修改 file3 文件

[root@bogon project]# git status # 查看当前状态

# 位于分支 master

# 尚未暂存以备提交的变更:

# (使用 "git add <file>..." 更新要提交的内容)

# (使用 "git checkout -- <file>..." 丢弃工作区的改动)

#

# 修改: file3

#

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

[root@bogon project]# git commit -a -m 'update file3 on master' #提交至master分区

[master 2922456] update file3 on master

 1 file changed, 1 insertion(+)

[root@bogon project]# git status #在次查看状态

# 位于分支 master

无文件要提交,干净的工作区
  • 然后切换到experimental,修改file3并提交:
[root@bogon project]# git checkout experimental # 切换至 experimental 分支
切换到分支 'experimental'
[root@bogon project]# echo "experimental: update file3" >> file3 # 修改 file3 文本
[root@bogon project]# git commit -a -m 'update file3 on experimental' # 提交至experimental 分支
[experimental e511488] update file3 on experimental
 1 file changed, 1 insertion(+)
  • 切换到master进行合并:
[root@bogon project]# git checkout master # 切换至 master 分支
切换到分支 'master'
[root@bogon project]# git merge experimental # 合并分支
自动合并 file3
冲突(内容):合并冲突于 file3
自动合并失败,修正冲突然后提交修正的结果。
  • 合并失败后先用git status查看状态,会发现file3显示为both modified,查看file3内容会发现:
[root@bogon project]# git status #查看状态
# 位于分支 master
# 您有尚未合并的路径。
# (解决冲突并运行 "git commit")
#
# 未合并的路径:
# (使用 "git add <file>..." 标记解决方案)
#
# 双方修改: file3
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@bogon project]# cat file3 # 查看产生冲突的文件
test
<<<<<<< HEAD
master:update file3
=======
experimental: update file3
>>>>>>> experimental

上面的内容也可以使用git diff查看,先前已经提到git diff不加参数可以显示未提交到缓存区中的修改内容。

  • 可以看到冲突的内容都被添加到了file3中,我们使用vim编辑这个文件,去掉git自动产生标志冲突的<<<<<<等符号后,根据需要只保留我们需要的内容后保存,然后使用git add file3和git commit命令来提交合并后的file3内容,这个过程是手动解决冲突的流程。
[root@bogon project]# vim file3 # 使用 vim 打开文件修改

[root@bogon project]# git status #查看状态

# 位于分支 master

# 您有尚未合并的路径。

# (解决冲突并运行 "git commit")

#

# 未合并的路径:

# (使用 "git add <file>..." 标记解决方案)

#

# 双方修改: file3

#

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

[root@bogon project]# git add file3 # 将文件加入缓存

[root@bogon project]# git status # 再次查看状态

# 位于分支 master

# 所有冲突已解决但您仍处于合并中。

# (使用 "git commit" 结束合并)

#

# 要提交的变更:

#

# 修改: file3

#

[root@bogon project]# git commit -m 'merge file3' # 提交修改的文件

[master 6b63f36] merge file3
  • 当我们完成合并后,不再需要experimental时,可以使用下面的命令删除:
[root@bogon project]# git branch -d experimental
已删除分支 experimental(曾为 e511488)。

git branch -d只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D

撤销一个合并

  • 如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:
[root@bogon project]# git reset --hard HEAD^
HEAD 现在位于 2922456 update file3 on master
[root@bogon project]# cat file3
test
master:update file3

推送至远程仓库

  • 在本机完成改动后就可以提交到远程仓库了
git push origin master

可以把 master 换成你想要推送的任何分支。

  • 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:
git remote add origin <server>

如此你就能够将你的改动推送到所添加的服务器上去了。

更新与合并

  • 要更新你的本地仓库至最新改动,执行:
git pull

以在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动。

  • 要合并其他分支到你的当前分支(例如 master),执行:
git merge <branch>
  • 在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功:
git add <filename>
  • 在合并改动之前,你可以使用如下命令预览差异:
git diff <source_branch> <target_branch>

参考:Git Pro、阮一峰的网络日志

欢迎访问我的个人Blog:xiangcl.com

本文由金沙棋牌发布于操作系统,转载请注明出处:git学习笔记,小白专供版金沙棋牌

关键词: