初始化git

配置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,进而选用针对当前项指标安排。

配置GitHub

注册GitHub

一而再一而再有时间另写后生可畏篇教程,这里不在赘述…

配置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则代表连接成功。

得到贰个Git仓库

既然如此大家明天把全路都设置好了,那么我们要求一个Git酒店。有二种办法能够获得它:生龙活虎种是从本来就有的Git饭店中clone
(克隆,复制);还也有意气风发种是新建三个储藏室,把未实行版本调节的文件举行版本调节。

Clone二个商旅

  • 为了得八个类型的正片(copy),大家须求明白这么些类型货仓的地址(Git U库罗德L).
    Git能在数不尽合计下行使,所以Git
    U奇骏L可能以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卡塔 尔(英语:State of Qatar)
  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卡塔 尔(英语:State of Qatar)。

  • 使用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 以来别人付出的更新卡塔 尔(英语:State of Qatar)。有有些很注重,需求深深记住,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'

翻开下file第11中学的内容会发觉刚才做的改动已经看不到了。因为刚刚的改正时在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卡塔 尔(英语:State of Qatar) 远端的改动。

  • 要统大器晚成别的分支到您的一时支行(譬如 master卡塔尔,实施:

git merge <branch>
  • 在此二种情况下,git
    都会尝试去自动合併改造。可惜的是,这或然毫无每便都功成业就,并恐怕出现冲突(conflicts卡塔尔。
    那时就需求您改改那几个文件来手动归拢这一个冲突(conflicts卡塔 尔(阿拉伯语:قطر‎。改完事后,你须要推行如下命令以将它们标志为统十分之一功:

git add <filename>
  • 在集结改过以前,你能够行使如下命令预览差别:

git diff <source_branch> <target_branch>

参考:Git
Pro、阮豆蔻梢头峰的互联网日志

款待访谈作者的个人Blog:xiangcl.com