git

git命令

git介绍

分布式版本控制系统。

git版本库操作

  1. 创建git仓库
    在C:\github\创建目录helloworld,进入该目录C:\github\helloworld,打开git bash,执行以下命令
$ git init
Initialized empty Git repository in C:/github/helloworld/.git/

会发现C:\github\helloworld目录下多了一个.git文件夹

  1. git仓库添加文件
$ touch README.md
$ vim README.md
$ git add README.md
  1. git提交文件到仓库
 git commit -m "wrote a readme file"
  1. 修改文件,查看git仓库状态以及文件修改状态
    更改README.md文件内容,查看git仓库状态
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

git status告诉我们将要提交的仓库在工作区和暂存区(工作区和暂存区下面介绍)做了哪些修改
在git提交文件之前,我们忘记了文件做了什么修改,可以先查看下文件的修改情况.

$ git diff README.md
diff --git a/README.md b/README.md
index b80c463..8589d53 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,7 @@
 学习git的Java 例子
+1、初始化git 仓库
+git init
+2、添加文件到git仓库
+git add file1 file2 ...
+3、提交修改到git仓库
+git commit -m "提交变更到git"
  1. 再次提交文件
    提交新增的文件和修改过的文件,都需要先使用git add指令把文件添加到git仓库
$ git add README.md
$ git commit -m "修改README.md"
//向仓库添加所有改动
git add -A
//向仓库添加所有新增和更改的文件
git add .
git add *
//添加修改和删除,但是不包括新建文件
git add -u .

小结

  • [x] git init初始化git仓库
  • [x] git add -A 添加文件(新增/变更/删除)
  • [x] git commit提交文件到仓库

git版本控制

git版本回退

  1. git log查看仓库提交历史
$ git log
commit 4fcf873881ab2b8b5eb03cbfef1d641b632eb289
Author: jjqiubj@cn.ibm.com <jjqiubj@cn.ibm.com>
Date:   Tue May 9 13:22:10 2017 +0800

    test delete

commit 40033016fc902101e4ce27ee7eb19709bee3f016
Author: jjqiubj@cn.ibm.com <jjqiubj@cn.ibm.com>
Date:   Tue May 9 13:16:11 2017 +0800

    add test.txt

commit 8010ee0ba5f6f130bcc3dee1956b58eb1617f674
Author: jjqiubj@cn.ibm.com <jjqiubj@cn.ibm.com>
Date:   Mon May 8 15:59:46 2017 +0800

    修改README.md

commit bae79353290525e4fa3607e33666b5fbb09eff60
Author: jjqiubj@cn.ibm.com <jjqiubj@cn.ibm.com>
Date:   Mon May 8 15:42:37 2017 +0800

    wrote a readme file

git log命令显示从最近到最远的提交日志。Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示
2.git reset版本回退
回退到README.md第一次修改提交的地方

 git reset --hard bae79353290525e4fa3607e33666b5fbb09eff60
HEAD is now at bae7935 wrote a readme file
$ git log
commit bae79353290525e4fa3607e33666b5fbb09eff60
Author: jjqiubj@cn.ibm.com <jjqiubj@cn.ibm.com>
Date:   Mon May 8 15:42:37 2017 +0800

    wrote a readme file

回退后在使用git log查看记录,只会看到"第一提交"到"回退版本"之间的log
3.git reflog查看命令历史,帮助版本回退到“未来”
如果先想回退到“回退版本”到“最新提交”之间的版本,可以使用reflog获取到所有的commit id

$ git reflog
8010ee0 HEAD@{0}: reset: moving to 8010ee0ba5f6f130bcc3dee1956b58eb1617f674
bae7935 HEAD@{1}: reset: moving to bae79353290525e4fa3607e33666b5fbb09eff60
17f7439 HEAD@{2}: commit: delete
43b1130 HEAD@{3}: commit: add
4fcf873 HEAD@{4}: commit: test delete
4003301 HEAD@{5}: commit: add test.txt
8010ee0 HEAD@{6}: commit: 修改README.md
bae7935 HEAD@{7}: commit (initial): wrote a readme file
$ git reset --hard 8010ee0

总结

  • [x] git log查看提交历史
  • [x] git reset --hard commit-id 版本回退
  • [x] git reflog查看git命令执行历史

git工作区和暂存区

  1. 工作区
    工作区就是git项目的目录,比如C:\github\helloworld
  2. 版本库
    工作区有个目录.git,这个不算是工作区,是Git的版本库。
    版本库中存放的有暂存区stage,git为我们创建的第一个分支master,以及指向master的指针HEAD


    git初始化项目
  3. 暂存区和工作区

git代码提交分为两步:第一步,git add,这个步骤就是把文件提交到暂存区;第二步,git commit,这个步骤就是把暂存区的所有内容提交到当前分支。
eg:

  • git项目中修改README.md,添加一个新的文件
  • 查看仓库当前状态
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        LICENSE

no changes added to commit (use "git add" and/or "git commit -a")
  • 执行git add
$ git add .

qiujiaojiao@ADMINIB-39ARTF6 MINGW64 /c/github/helloworld (master)
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   LICENSE
        modified:   README.md

执行完git add,变更被保存在git 暂存区,这个时候git项目的文件结构如下:

git add项目结构

执行完git commit,暂存区的内容就被提交到当前分支,这个时候的git项目的文件结构如下:
git commit后项目结构

小结

  • [x] git先将代码添加到暂存区,然后才提交到当前分支。git的有个HEAD指针指向当前分支

git变更管理

  1. 撤销修改
  • 工作区修改了,没有add到暂存区:git checkout --
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

qiujiaojiao@ADMINIB-39ARTF6 MINGW64 /c/github/helloworld (master)
$ git checkout -- README.md

  • 工作区修改了,已经添加到暂存区

eg: 修改已经在暂存区了

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   README.md

撤销暂存区变更

$ git reset HEAD README.md
Unstaged changes after reset:
M       README.md
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

撤销工作区修改

$ git checkout -- README.md

qiujiaojiao@ADMINIB-39ARTF6 MINGW64 /c/github/helloworld (master)
$ git status
On branch master
nothing to commit, working directory clean

2.删除

  • 工作区删除了,希望版本库也删除
    eg: 工作区当前已经处于删除状态
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    test.txt

no changes added to commit (use "git add" and/or "git commit -a")

更新删除到版本库

$ git rm test.txt 
rm 'test.txt'
$ git commit -m "delete modify"
[master 4bc4820] delete modify
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 test.txt

qiujiaojiao@ADMINIB-39ARTF6 MINGW64 /c/github/helloworld (master)
$ git status
On branch master
nothing to commit, working directory clean

  • 工作区删除了,但是不希望版本库删除
$ git checkout -- test.txt

qiujiaojiao@ADMINIB-39ARTF6 MINGW64 /c/github/helloworld (master)
$ git status
On branch master
nothing to commit, working directory clean

总结

  • [x] 工作区删除,希望版本库删除:(1)git rm ${file} (2) git commit -m
  • [x] 工作区误删除,恢复工作区: git checkout -- ${file}

git远程仓库

可以自己搭建一个git服务器,做为git远程仓库的服务器。也可以使用官网github。本文以官网GitHub为例

添加远程仓库

  1. 配置GitHub的SSH Key
$ ssh-keygen -t rsa -C "henu_qjj@sina.cn"
#根据提示输入回车键即可
  1. 把生成的公钥文拷贝到GitHub上
    GitHub官网注册->登录GitHub->Settings->SSH and GPG keys->New SSH Key
    id_rsa.pub的内容拷贝上去,这样你的这台pc就可以向GitHub推送内容了。
  2. GitHub上创建远程仓库
    登录GitHub->New repository,创建一个新的远程仓库
  3. 本地仓库跟远程仓库关联
    根据GitHub创建仓库后的提示,把本地仓库和远程关联起来。
$ git remote add origin https://github.com/${GitHub-username}/helloworld.git

提交本地库内容到远程库

git push -u origin master

总结

  • [x] 本地仓库跟远程仓库关联:
    git remote add origin https://github.com/${GitHub-username}/helloworld.git
  • [x] 第一次推送本地所有内容到远程仓库
    git push -u origin master

从远程仓库克隆

  1. 在GitHub创建远程仓库
  2. 下载远程仓库

GitHub支持两种方式的下载

//使用git协议,使用ssh key校验,git push不需要输入用户名和密码
$ git clone git@github.com:qiuyu2014/gitrepository.git

或者

//使用https协议,git push 代码的时候需要输入用户名和密码
$ git clone https://github.com/qiuyu2014/gitrepository.git

git 支持多种协议:地传输,SSH 协议,Git 协议和 HTTP 协议等,Reference Git协议
总结

  • [x] git关联远程仓库:(1)git remote add origin https://github.com/${GitHub-username}/${git-project}.git (2)git push -u origin master
  • [x] git从远程仓库下载代码:git clone

git分支管理

原理

master:指向master分支最新提交的指针
dev:指向dev分支的最新提交的指针
HEAD:当前分支最新提交的指针,例如:如果当前分支是master,则指向master指针

  1. 刚开始git项目,是一条直线,master指向最新提交HEAD指向当前分支的最新提交


  2. master分支每次提交,master和HEAD都会向前移动


  3. 创建dev分支


  4. 现在切换到dev分支
    在dev分支下,修改项目,提交变更
  5. dev分支合并到master分支
    直接修改master指针,指向dev的最新提交就可以了。


分支基本命令使用例子

  1. 创建新的分支dev
$ git branch dev
  1. 切换到dev分支
$ git checkout dev
Switched to branch 'dev'
  1. 查看当前分支
$ git branch
* dev
  master

4.修改dev分支内容

$ git status
On branch dev
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md
$ git add README.md
$ git commit -m "分支管理"
[dev b182941] 分支管理
 1 file changed, 1 insertion(+)

5.切换master

$ git checkout master

发现master分支上,看不到dev修改提交的内容
6.合并分支
git merge 合并指定分支到当前分支

$ git merge dev
Updating 28e754e..b182941
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)

Fast-forward信息,是指这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
git merge 合并指定分支到当前分支
7.删除dev分支

$ git branch -d dev
Deleted branch dev (was b182941).

总结

  • [x] 查看分支:git branch
  • [x] 创建分支:git branch ${branch-name}
  • [x] 切换分支:git checkout ${branch-name}
  • [x] 创建并切换分支:git checkout -b ${branch-name}
  • [x] 合并某分支到当前分支:git merge ${branch-name}
  • [x] 删除分支:git branch -d ${branch-name}

冲突解决

  1. 创建并切换到dev分支
$ git checkout -b dev
//修改README.md,添加以下内容
四 git冲突解决:dev分支内容
  1. 提交dev修改
$ git add README.md
$ git commit -m "冲突解决:dev"
  1. master分支修改
$ git checkout master
//修改README.md,添加以下内容
四 git冲突解决:master分支内容
$ git add README.md
$ git commit -m "冲突解决:master"

当前dev,master以及HEAD指针如下图所示:


  1. 合并dev到master分支
$ git merge dev
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

5.解决冲突,重新提交
查看master分支的README.md文件,冲突内容如下

<<<<<<< HEAD
四 git分支解决:master
=======
四 git冲突解决:dev分支内容
>>>>>>> dev

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:

四 git分支解决:master
四 git冲突解决:dev分支内容

提交master解决冲突后的修改

$ git add README.md
$ git commit -m "冲突解决"

现在master和dev的情况如下图:



查看master分支合并情况

git log --graph --pretty=oneline --abbrev-commit

总结

  • [x] git merge 会把要合并的分支和当前代码合并到一起,会列出冲突
  • [x] 合并后的冲突需手动解决,然后提交代码
  • [x] git log --graph可以查看合并图

gitlab安装配置

Reference:

https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/

https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/

  1. 安装gitlab
    本文使用的是ubuntu14.04,其他操作系统请参考Reference给出的链接。
// 首先信任 GitLab 的 GPG 公钥:
root@kvm-009864:~# curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null
//配置软件源
vim /etc/apt/sources.list.d/gitlab-ce.list
deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu trusty main
//安装gitlab-ce
sudo apt-get update
sudo apt-get install gitlab-ce
  1. 启动gitlab
//配置并启动
sudo gitlab-ctl reconfigure

在浏览器输入http://${ip},第一次登陆会让更改密码,用户名是root。
gitlab的配置文件/etc/gitlab/gitlab.rb,如果要修改gitlab的配置,修改该文件相应的配置即可,然后执行sudo gitlab-ctl reconfigure 就可以重新加载配置,并启动gitlab

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 1.git的安装 1.1 在Windows上安装Git msysgit是Windows版的Git,从https:/...
    落魂灬阅读 12,655评论 4 54
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,645评论 9 163
  • GIT分布式版本控制系统最佳实践 这篇文章来自于老男孩教育高级架构师班12期的徐亮偉同学。 首先感谢老男孩架构师班...
    meng_philip123阅读 3,400评论 4 36
  • POJ 1862 题意 求变形虫合成的最小值,两个变形虫合成的公式为$$m3 = 2*sqrt(m1 * m2)$...
    vanadia阅读 178评论 0 0
  • 工作的原因,大学毕业之后忘却了写作的习惯,今日无意间在朋友圈发现这个软件索性就拿来练练手。有想过给这篇文章命个题,...
    新碩良君阅读 310评论 2 2