dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
阅读:2295回复:16

git 分布式版本控制系统

楼主#
更多 发布于:2016-01-15 09:46
目标
学习git ,了解git 流程;

Git简介
Git是目前最先进的分布式版本控制系统

Linus 虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!

Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!

集中式vs分布式
Linus一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?

集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死。

首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。

既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!

创建版本库

什么是版本库呢?
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

第1步,在合适的地方创建一个空目录
mkdir git
cd git/


第2步,通过git init命令把这个目录变成Git可以管理的仓库
git init
初始化空的 Git 版本库于 /home/dongnan/git/.git/
#注意,通过git hub 创建的项目,不需要初始化。

可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
ls .git/
branches  config  description  HEAD  hooks  info  objects  refs

把文件添加到版本库
首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。

而图片、视频这些二进制文件(如 Word文件),虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

1. clone项目
git clone git@ywwd.net:dongnan/oma.git

2. 设置标识
git config --global user.email "dongnan@ywwd.net.com"
git config --global user.name "dongnan"


3. 添加文件
cd oma
cp shell .
git add shell


4. 提交文件
git commit -m "add defend_ssh to shell"
[master 8e43be6] defend_ssh
 2 files changed, 39 insertions(+)
 create mode 100644 shell/ssh/defend_ssh.awk
 create mode 100644 shell/ssh/defend_ssh.sh

5. 推送文件
git push origin master

6. 检查git 状态
git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
无文件要提交,干净的工作区

小结
现在总结一下今天学的两点内容:
初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
1. 使用命令git add <file>,注意,可反复多次使用,添加多个文件;
2. 使用命令git commit,完成。

git 帮助
git --help
用法:git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]
 
这些是各种场合常见的 Git 命令:
开始一个工作区(参见:git help tutorial)
   clone      克隆一个仓库到一个新目录
   init       创建一个空的 Git 仓库或重新初始化一个已存在的仓库
 
在当前变更上工作(参见:git help everyday)
   add        添加文件内容至索引
   mv         移动或重命名一个文件、目录或符号链接
   reset      重置当前 HEAD 到指定状态
   rm         从工作区和索引中删除文件
 
检查历史和状态(参见:git help revisions)
   bisect     通过二分查找定位引入 bug 的提交
   grep       输出和模式匹配的行
   log        显示提交日志
   show       显示各种类型的对象
   status     显示工作区状态
 
扩展、标记和调校您的历史记录
   branch     列出、创建或删除分支
   checkout   切换分支或恢复工作区文件
   commit     记录变更到仓库
   diff       显示提交之间、提交和工作区之间等的差异
   merge      合并两个或更多开发历史
   rebase     在另一个分支上重新应用提交
   tag        创建、列出、删除或校验一个 GPG 签名的标签对象
 
协同(参见:git help workflows)
   fetch      从另外一个仓库下载对象和引用
   pull       获取并整合另外的仓库或一个本地分支
   push       更新远程引用和相关的对象
 
命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些概念帮助。
查看 'git help <命令>' 或 'git help <概念>' 以获取给定子命令或概念的帮助。
#
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
沙发#
发布于:2016-01-15 15:41
git 删除文件
git 删除文件

在Git中 删除也是一个修改操作
git rm mysql_bak.sh
rm 'shell/ssh/mysql_bak.sh'
mysql_bak.sh 文件被删除了:

状态
git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。

要提交的变更:
  (使用 "git reset HEAD <file>..." 撤出暂存区)

    删除:         mysql_bak.sh

现在你有两个选择:
1. 确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
#git rm mysql_bak.sh
git commit -m "remove mysql_bak.sh"

现在,文件就从版本库中被删除了。
git status
位于分支 master
无文件要提交,干净的工作区

2. 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
git reset HEAD  mysql_bak.sh
重置后撤出暂存区的变更:
D    shell/ssh/mysql_bak.sh

#
git checkout -- mysql_bak.sh

小结
命令git rm 用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

从版本库中删除该文件,那就用命令git rm删掉,并且git commit


参考:git 删除文件
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
板凳#
发布于:2016-01-15 15:45
git 移动/重命名文件
示例:移动文件
git mv mysql_bak.sh ../

状态
git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。

要提交的变更:
  (使用 "git reset HEAD <file>..." 撤出暂存区)

    重命名:       mysql_bak.sh -> ../mysql_bak.sh

提交
git commit -m "move mysql_bak.sh to top"
[master e8486a5] remove mysql_bak.sh to top
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename shell/{ssh => }/mysql_bak.sh (100%)

推送文件
git push origin master
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 392 bytes | 0 bytes/s, done.
Total 4 (delta 1), reused 0 (delta 0)
To git@ywwd.net:dongnan/oma.git
   e990aff..e8486a5  master -> master

状态
git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。

无文件要提交,干净的工作区

验证

图片:1.png



#
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
地板#
发布于:2016-01-22 17:30
git 修改文件后需要再次提交
场景
git 本地更新了 mysql_bak.sh 文件;

添加
git add mysql_bak.sh

提交文件
git commit -m "mysql_bak.sh 认证使用配置文件"
[master 66f10f0] mysql_bak.sh 认证使用配置文件
 1 file changed, 9 insertions(+), 10 deletions(-)

推送文件
git push origin master
Counting objects: 7, done.
Delta compression using up to 4 threads.
...省略
To git@ywwd.net:dongnan/oma.git
   faad330..66f10f0  master -> master

#
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
4楼#
发布于:2016-01-28 14:39
git status 状态,git diff 差异比较
我们已经成功地添加并提交了一个README.md 文件,我们继续修改README.md 文件;

运行git status 命令 检查状态
git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。

尚未暂存以备提交的变更
  (使用 "git add <file>..." 更新要提交的内容)
  (使用 "git checkout -- <file>..." 丢弃工作区的改动)

    修改:         README.md

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

运行git diff 命令比较差异
#git diff 顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从下面的命令输出看到,我们在第一行添加了一个“distributed”单词。
git diff README.md
diff --git a/README.md b/README.md
index 2df2813..67095bf 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,4 @@
 # for oma
-      #注意
 oma
 ├── README.md
 └── shell

提交
知道了对README.md作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,
1. 添加文件
git add README.md

2. 提交修改
git commit -m "修改readme.md"
[master 37297c0] 修改readme.md
 1 file changed, 1 deletion(-)

提交后,我们再用git status命令看看仓库的当前状态:
git status
位于分支 master
您的分支领先 'origin/master' 共 1 个提交。
  (使用 "git push" 来发布您的本地提交)

无文件要提交,干净的工作区

3. push 文件
git push origin master
Counting objects: 5, done.
Delta compression using up to 4 threads.

小结

1. 要随时掌握工作区的状态,使用git status命令。
2. 如果git status告诉你有文件被修改过,用git diff可以查看修改内容。


参考:时光机穿梭
#
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
5楼#
发布于:2017-01-16 14:58
git 查看当前分支
示例
git branch -l
  master
* online

帮助
git branch --help
NAME
       git-branch - List, create, or delete branches
#待续...
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
6楼#
发布于:2017-01-16 15:03
git 切换分支
示例:git 切换分支
git checkout online

Switched to branch 'online'
 
查看分支
git branch -l
  master
* online

帮助
git checkout --help
NAME
       git-checkout - Checkout a branch or paths to the working tree

#
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
7楼#
发布于:2017-01-16 15:06
git 删除远程主分支
示例
git push origin :dev
To git@git.zongming.net:dongnan/smartTC.git
 - [deleted]         dev

注意,冒号前的空格,通过 push 一个空的分支,来达到删除远程分支的目的。

验证
git branch -a
  master
* php
  python
  remotes/origin/master
  remotes/origin/php
  remotes/origin/python

#
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
8楼#
发布于:2017-01-16 15:08
git 查看远程信息
举个栗子:git 远程仓库信息
git remote -v
origin    git@GIT_IP:dongnan/oma.git (fetch)
origin    git@GIT_IP:dongnan/oma.git (push)

#
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
9楼#
发布于:2017-01-17 21:55
git 查看远程全部分支
示例
git remote show origin
* 远程 origin
  获取地址:https://github.com/vmware/harbor
  推送地址:https://github.com/vmware/harbor
  HEAD 分支:master
  远程分支:
    0.1.1                       已跟踪
    configuration               新的(下一次获取将存储于 remotes/origin)
    dev                         已跟踪
    gh-pages                    已跟踪
    master                      已跟踪
    pp-poc                      已跟踪
    refs/remotes/origin/dev-bak 过时(使用 'git remote prune' 来移除)
    yhua123-patch-1             新的(下一次获取将存储于 remotes/origin)
  为 'git pull' 配置的本地分支:
    master 与远程 master 合并
  为 'git push' 配置的本地引用:
    master 推送至 master (本地已过时)
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
10楼#
发布于:2017-06-16 16:35
git 创建分支
目标
熟悉 git 分支操作,例如,创建,切换,删除,等。

环境

#当前分支
git branch -l
* master

步骤
1. 创建分支
git branch dev

2. 列出分支
git branch -l
  dev
* master

3. 切换分支
git checkout dev
切换到分支 'dev'

4. 当前分支(注意*号)
git branch -l
* dev
  master

5. 删除分支
git branch -D dev
已删除分支 dev(曾为 25dbf4f)。

帮助
git branch -h
用法:git branch [选项] [-r | -a] [--merged | --no-merged]
   或:git branch [选项] [-l] [-f] <分支名> [<起始点>]
   或:git branch [选项] [-r] (-d | -D) <分支名>...
   或:git branch [选项] (-m | -M) [<旧分支>] <新分支>

通用选项
    -v, --verbose         显示哈希值和主题,若参数出现两次则显示上游分支
    -q, --quiet           不显示信息
    -t, --track           设置跟踪模式(参见 git-pull(1))
    --set-upstream        改变上游信息
    -u, --set-upstream-to <upstream>
                          change the upstream info
    --unset-upstream      Unset the upstream info
    --color[=<何时>]      使用彩色输出
    -r, --remotes         作用于远程跟踪分支
    --contains <提交>     只打印包含该提交的分支
    --abbrev[=<n>]        用 <n> 位数字显示 SHA-1 哈希值

具体的 git-branch 动作:
    -a, --all             列出远程跟踪及本地分支
    -d, --delete          删除完全合并的分支
    -D                    删除分支(即使没有合并)
    -m, --move            移动/重命名一个分支,以及它的引用日志
    -M                    移动/重命名一个分支,即使目标已存在
    --list                列出分支名
    -l, --create-reflog   创建分支的引用日志
    --edit-description    标记分支的描述
    -f, --force           强制创建(当已经存在)
    --no-merged <提交>    只打印没有合并的分支
    --merged <提交>       只打印合并的分支
    --column[=<风格>]     以列的方式显示分支

#
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
11楼#
发布于:2017-07-05 12:40
git merge 合并分支
http://zongming.net/read-1234
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
12楼#
发布于:2017-07-28 16:06
git 更改远程地址协议
http://zongming.net/read-1322
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
13楼#
发布于:2017-10-31 10:52
git clone 指定的分支
http://zongming.net/read-1335
技术QQ群 https://zongming.net/app-index-run?app=qqun
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币12474枚
  • 威望5607点
  • 银元145个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
14楼#
发布于:2017-12-12 14:24
git 强制 push 远程分支
http://zongming.net/read-1341
技术QQ群 https://zongming.net/app-index-run?app=qqun
上一页

返回顶部