版本控制(Revision control)是一种在开发的过程当中用于管理咱们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复之前的版本的软件工程技术。html
简单说就是用于管理多人协同开发项目的技术。java
没有进行版本控制或者版本控制自己缺少正确的流程管理,在软件开发过程当中将会引入不少问题,如软件代码的一致性、软件内容的冗余、软件过程的事物性、软件开发过程当中的并发性、软件源代码的安全性,以及软件的整合等问题。git
1)、仓库(Repository)
受版本控制的全部文件修订历史的共享数据库程序员
2)、工做空间(Workspace)
本地硬盘或Unix 用户账户上编辑的文件副本github
3)、工做树/区(Working tree)
工做区中包含了仓库的工做文件。您能够修改的内容和提交更改做为新的提交到仓库。正则表达式
4)、暂存区(Staging area)
暂存区是工做区用来提交更改(commit)前能够暂存工做区的变化。算法
5)、索引(Index)
索引是暂存区的另外一种术语。shell
6)、签入(Checkin)
将新版本复制回仓库数据库
7)、签出(Checkout)
从仓库中将文件的最新修订版本复制到工做空间windows
8)、提交(Commit)
对各自文件的工做副本作了更改,并将这些更改提交到仓库
9)、冲突(Conflict)
多人对同一文件的工做副本进行更改,并将这些更改提交到仓库
10)、合并(Merge)
将某分支上的更改联接到此主干或同为主干的另外一个分支
11)、分支(Branch)
从主线上分离开的副本,默认分支叫master
12)、锁(Lock)
得到修改文件的专有权限。
13)、头(HEAD)
头是一个象征性的参考,最经常使用以指向当前选择的分支。
14)、修订(Revision)
表示代码的一个版本状态。Git经过用SHA1 hash算法表示的ID来标识不一样的版本。
15)、标记(Tags)
标记指的是某个分支某个特定时间点的状态。经过标记,能够很方便的切换到标记时的状态。
主流的版本控制器有以下这些:
版本控制产品很是的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),如今影响力最大且使用最普遍的是Git与SVN
记录文件每次的更新,能够对每一个版本作一个快照,或是记录补丁文件,适合我的用,如RCS。
全部的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传本身的修改
全部的版本数据都存在服务器上,用户的本地只有本身之前所同步的版本,若是不连网的话,用户就看不到历史版本,也没法切换版本验证问题,或在不一样分支工做。并且,全部数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失全部的数据,固然能够按期备份。表明产品:SVN、CVS、VSS
全部版本信息仓库所有同步到本地的每一个用户,这样就能够在本地查看全部版本历史,能够离线在本地提交,只需在连网时push到相应的服务器或其余用户那里。因为每一个用户那里保存的都是全部的版本数据,只要有一个用户的设备没有问题就能够恢复全部的数据,但这增长了本地存储空间的占用。
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工做的时候,用的都是本身的电脑,因此首先要从中央服务器获得最新的版本,而后工做,完成工做后,须要把本身作完的活推送到中央服务器。集中式版本控制系统是必须联网才能工做,对网络带宽要求较高。
Git是分布式版本控制系统,没有中央服务器,每一个人的电脑就是一个完整的版本库,工做的时候不须要联网了,由于版本都在本身电脑上。协同的方法是这样的:好比说本身在电脑上改了文件A,其余人也在电脑上改了文件A,这时,大家两之间只需把各自的修改推送给对方,就能够互相看到对方的修改了。
Git是目前世界上最早进的分布式版本控制系统。
Git是免费、开源的
最初Git是为辅助 Linux 内核开发的,来替代 BitKeeper
做者:Linux和Git之父李纳斯·托沃兹(Linus Benedic Torvalds)196九、芬兰
优势:
缺点:
源码: https://github.com/git/git/
打开 git官网,下载git对应操做系统的版本。
选择版本:
这里我选择下载64-bit Git for Windows Setup
选择安装配置信息
一直Next默认就行了,若是须要设置就要仔细读一下安装界面上的选项。
安装成功后在开始菜单中会有Git项,菜单下有3个程序:
Git Bash:Unix与Linux风格的命令行,使用最多,推荐最多
与DOS风格的命令有些区别,不习惯能够选择Git CMD
Git CMD:Windows风格的命令行
Git GUI:图形界面的Git,不建议初学者使用,尽可能先熟悉经常使用命令
点击Create New Repository能够直接建立一个新的仓库。
Linux安装Git:sudo apt-get install git 命令行就能够安装了。
Mac OS安装Git: https://git-scm.com/download/mac,下载双击.pkg安装
1)、cd : 改变目录。
2)、cd . . 回退到上一个目录,直接cd进入默认目录
3)、pwd : 显示当前所在的目录路径。
4)、ls(ll): 都是列出当前目录中的全部文件,只不过ll(两个ll)列出的内容更为详细。
5)、touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。
6)、rm: 删除一个文件, rm index.js 就会把index.js文件删除。
7)、mkdir: 新建一个目录,就是新建一个文件夹。
8)、rm -r : 删除一个文件夹, rm -r src 删除src目录, 好像不能用通配符。
9)、mv 移动文件, mv index.html src index.html 是咱们要移动的文件, src 是目标文件夹,固然, 这样写,必须保证文件和目标文件夹在同一目录下。
10)、reset 从新初始化终端/清屏。
11)、clear 清屏。
12)、history 查看命令历史。
13)、help 帮助。
14)、exit 退出。
15)、#表示注释
使用git config -l 能够查看如今的git环境详细配置
查看不一样级别的配置文件:
#查看系统config git config --system --list #查看当前用户(global)配置 git config --global --list #查看当前仓库配置信息 git config --local --list
在Windows系统中,Git在$HOME目录中查找.gitconfig文件(通常位于C:\Documents and Settings\$USER下)
Git相关的配置文件有三个:
1)、 /etc/gitconfig:包含了适用于系统全部用户和全部项目的值。(Win:C:\Program Files\Git\mingw64\etc\gitconfig) --system 系统级
2)、~/.gitconfig:只适用于当前登陆用户的配置。(Win:C:\Users\Administrator\.gitconfig) --global 全局
3)、位于git项目目录中的.git/config:适用于特定git项目的配置。(Win:C:\gitProject) --local当前项目
注意:对于同一配置项,三个配置文件的优先级是1<2<3
这里能够直接编辑配置文件,经过命令设置后会响应到这里。
当你安装Git后首先要作的事情是设置你的用户名称和e-mail地址。这是很是重要的,由于每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中:
$ git config --global user.name "zhangguo" #名称 $ git config --global user.email zhangguo@qq.com #邮箱
只须要作一次这个设置,若是你传递了--global 选项,由于Git将老是会使用该信息来处理你在系统中所作的一切操做。若是你但愿在一个特定的项目中使用不一样的名称或e-mail地址,你能够在该项目中运行该命令而不要--global选项。 总之--global为全局配置,不加为某个项目的特定配置。
git config [--local|--global|--system] section.key value [--local|--global|--system] #可选的,对应本地,全局,系统不一样级别的设置,请看2.3.2 section.key #区域下的键 value #对应的值
--local 项目级
--global 当前用户级
--system 系统级
例如咱们要在student区域下添加一个名称为height值为198的配置项,执行结果以下:
2)、删除配置项
git config [--local|--global|--system] --unset section.key
将系统级的height配置项移除
git config --global color.ui true #打开全部的默认终端着色 git config --global alias.ci commit #别名 ci 是commit的别名 [alias] co = checkout ci = commit st = status pl = pull ps = push dt = difftool l = log --stat cp = cherry-pick ca = commit -a b = branch user.name #用户名 user.email #邮箱 core.editor #文本编辑器 merge.tool #差别分析工具 core.paper "less -N" #配置显示方式 color.diff true #diff颜色配置 alias.co checkout #设置别名 git config user.name #得到用户名 git config core.filemode false #忽略修改权限的文件
全部config命令参数
语法: git config [<options>] 文件位置 --global #use global config file 使用全局配置文件 --system #use system config file 使用系统配置文件 --local #use repository config file 使用存储库配置文件 -f, --file <file> #use given config file 使用给定的配置文件 --blob <blob-id> #read config from given blob object 从给定的对象中读取配置 动做 --get #get value: name [value-regex] 得到值:[值]名[正则表达式] --get-all #get all values: key [value-regex] 得到全部值:[值]名[正则表达式] --get-regexp #get values for regexp: name-regex [value-regex] 获得的值根据正则 --get-urlmatch #get value specific for the URL: section[.var] URL 为URL获取特定的值 --replace-all #replace all matching variables: name value [value_regex] 替换全部匹配的变量:名称值[ value_regex ] --add #add a new variable: name value 添加一个新变量:name值 --unset #remove a variable: name [value-regex] 删除一个变量名[值]:正则表达式 --unset-all #remove all matches: name [value-regex] 删除全部匹配的正则表达式:名称[值] --rename-section #rename section: old-name new-name 重命名部分:旧名称 新名称 --remove-section #remove a section: name 删除部分:名称 -l, --list #list all 列出全部 -e, --edit #open an editor 打开一个编辑器 --get-color #find the color configured: slot [default] 找到配置的颜色:插槽[默认] --get-colorbool #find the color setting: slot [stdout-is-tty] 发现颜色设置:槽[ stdout是TTY ] 类型 --bool #value is "true" or "false" 值是“真”或“假”。 --int #value is decimal number 值是十进制数。 --bool-or-int #value is --bool or --int 值--布尔或int --path #value is a path (file or directory name) 值是路径(文件或目录名) 其它 -z, --null #terminate values with NUL byte 终止值与null字节 --name-only #show variable names only 只显示变量名 --includes #respect include directives on lookup 尊重包括查找指令 --show-origin #show origin of config (file, standard input, blob, command line) 显示配置(文件、标准输入、数据块、命令行)的来源
Git本地有三个工做区域:工做目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。若是在加上远程的git仓库(Remote Directory)就能够分为四个工做区域。文件在这四个区域之间的转换关系以下:
本地的三个区域确切的说应该是git仓库中HEAD指向的版本
git的工做流程通常是这样的:
1、在工做目录中添加、修改文件;
2、将须要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git仓库。
所以,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
我的认为Git的原理相比别的版本控制器仍是复杂一些的,有一份图解教程比较直观:
工做目录(WorkSpace)通常就是你但愿Git帮助你管理的文件夹,能够是你项目的目录,也能够是一个空目录,建议不要有中文。
平常使用只要记住下图6个命令:
建立本地仓库的方法有两种:一种是建立全新的仓库,另外一种是克隆远程仓库。
须要用GIT管理的项目的根目录执行:
# 在当前目录新建一个Git代码库 $ git init
执行:
结果:
执行后能够看到,仅仅在项目目录多出了一个.git目录,关于版本等的全部信息都在这个目录里面。
固然若是使用以下命令,能够把建立目录与仓库一块儿完成:
# 新建一个目录,将其初始化为Git代码库 $ git init [project-name]
执行命令与运行结果:
另外一种方式是克隆远程目录,因为是将远程服务器上的仓库彻底镜像一份至本地,而不是取某一个特定版本,因此用clone而不是checkout,语法格式以下:
# 克隆一个项目和它的整个代码历史(版本信息) $ git clone [url]
执行:
好比咱们要从克隆的远程仓库托管在github上,地址为:https://github.com/zhangguo5/SuperPlus.git,这是一个公开的项目
结果:
版本控制就是对文件的版本控制,要对文件进行修改、提交等操做,首先要知道文件当前在什么状态,否则可能会提交了如今还不想提交的文件,或者要提交的文件没提交上。GIT不关心文件两个版本之间的具体差异,而是关心文件的总体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件总体是否改变的方法就是用SHA-1算法计算文件的校验和。
Untracked: 未跟踪, 此文件在文件夹中, 但并无加入到git库, 不参与版本控制. 经过git add
状态变为Staged
.
Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中彻底一致. 这种类型的文件有两种去处, 若是它被修改, 而变为Modified
. 若是使用git rm
移出版本库, 则成为Untracked
文件
Modified: 文件已修改, 仅仅是修改, 并无进行其余的操做. 这个文件也有两个去处, 经过git add
可进入暂存staged
状态, 使用git checkout
则丢弃修改过, 返回到unmodify
状态, 这个git checkout
即从库中取出文件, 覆盖当前修改
Staged: 暂存状态. 执行git commit
则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify
状态. 执行git reset HEAD filename
取消暂存, 文件状态为Modified
上面说文件有4种状态,经过以下命令能够查看到文件的状态:
#查看指定文件状态 git status [filename] #查看全部文件状态 git status
命令:
结果:
foo.htm文件的状态为untracked(未跟踪),提示经过git add能够暂存
GIT在这一点作得很好,在输出每一个文件状态的同时还说明了怎么操做,像上图就有怎么暂存、怎么跟踪文件、怎么取消暂存的说明。
工做区(Working Directory)就是你在电脑里能看到的目录。
版本库(Repository)工做区有一个隐藏目录.git
,这个不算工做区,而是Git的版本库。
Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支master
,以及指向master
的一个指针叫HEAD
。
将untracked状态的文件添加到暂存区,语法格式以下:
# 添加指定文件到暂存区 $ git add [file1] [file2] ... # 添加指定目录到暂存区,包括子目录 $ git add [dir] # 添加当前目录的全部文件到暂存区 $ git add .
执行:
当执行以下命令时,会直接从暂存区删除文件,工做区则不作出改变
#直接从暂存区删除文件,工做区则不作出改变 git rm --cached <file>
执行命令
经过重写目录树移除add文件:
#若是已经用add 命令把文件加入stage了,就先须要从stage中撤销 git reset HEAD <file>...
当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,可是工做区不受影响。
示例:把f1.txt文件从暂存区撤回工做区
移除全部未跟踪文件
#移除全部未跟踪文件 #通常会加上参数-df,-d表示包含目录,-f表示强制清除。 git clean [options]
示例:
移除前:
执行移除:
移除后:
#只从stage中删除,保留物理文件 git rm --cached readme.txt #不但从stage中删除,同时删除物理文件 git rm readme.txt #把a.txt更名为b.txt git mv a.txt b.txt
当执行提交操做(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会作相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,可是工做区不受影响。
当执行 “git rm –cached <file>” 命令时,会直接从暂存区删除文件,工做区则不作出改变。
当执行 “git checkout .” 或者 “git checkout — <file>” 命令时,会用暂存区所有或指定的文件替换工做区的文件。这个操做很危险,会清除工做区中未添加到暂存区的改动。
当执行 “git checkout HEAD .” 或者 “git checkout HEAD <file>” 命令时,会用 HEAD 指向的 master 分支中的所有或者部分文件替换暂存区和以及工做区中的文件。这个命令也是极具危险性的,由于不但会清除工做区中未提交的改动,也会清除暂存区中未提交的改 动。
git diff用于显示WorkSpace中的文件和暂存区文件的差别
用"git status"只能查看对哪些文件作了改动,若是要看改动了什么,能够用:
#查看文件修改后的差别 git diff [files]
命令:
---a表示修改以前的文件,+++b表示修改后的文件
#比较暂存区的文件与以前已经提交过的文件 git diff --cached
也能够把WorkSpace中的状态和repo中的状态进行diff,命令以下:
#比较repo与工做空间中的文件差别 git diff HEAD~n
若是仓库中已经存在文件f4.txt,在工做区中对f4修改了,若是想撤销可使用checkout,签出覆盖
检出命令git checkout是git最经常使用的命令之一,同时也是一个很危险的命令,由于这条命令会重写工做区
语法:
#用法一 git checkout [-q] [<commit>] [--] <paths>... #用法二 git checkout [<branch>] #用法三 git checkout [-m] [[-b]--orphan] <new_branch>] [<start_point>]
<commit>是可选项,若是省略则至关于从暂存区(index)进行检出
$ git checkout branch #检出branch分支。要完成图中的三个步骤,更新HEAD以指向branch分支,以及用branch 指向的树更新暂存区和工做区。 $ git checkout #汇总显示工做区、暂存区与HEAD的差别。 $ git checkout HEAD #同上 $ git checkout -- filename #用暂存区中filename文件来覆盖工做区中的filename文件。至关于取消自上次执行git add filename以来(若是执行过)的本地修改。 $ git checkout branch -- filename #维持HEAD的指向不变。用branch所指向的提交中filename替换暂存区和工做区中相 应的文件。注意会将暂存区和工做区中的filename文件直接覆盖。 $ git checkout -- . 或写做 git checkout . #注意git checkout 命令后的参数为一个点(“.”)。这条命令最危险!会取消全部本地的 #修改(相对于暂存区)。至关于用暂存区的全部文件直接覆盖本地文件,不给用户任何确认的机会! $ git checkout commit_id -- file_name #若是不加commit_id,那么git checkout -- file_name 表示恢复文件到本地版本库中最新的状态。
示例:
有些时候咱们不想把某些文件归入版本控制中,好比数据库文件,临时文件,设计文件等
在主目录下创建".gitignore"文件,此文件有以下规则:
如:
#为注释 *.txt #忽略全部 .txt结尾的文件 !lib.txt #但lib.txt除外 /temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp build/ #忽略build/目录下的全部文件 doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
示例:
建立一个.gitignore文件忽视全部的日志文件
查看状态:
从上图中能够看出2个日志文件并无添加到暂存区,直接被忽视了。
针对各类语言与项目的Git忽视文件: https://github.com/kaedei/gitignore https://github.com/github/gitignore
通用的java忽视文件:
# Compiled class file *.class # Log file *.log # BlueJ files *.ctxt # Mobile Tools for Java (J2ME) .mtj.tmp/ # Package Files # *.jar *.war *.ear *.zip *.tar.gz *.rar # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid*
通用的Visual Studio开发项目忽视文件:
经过add只是将文件或目录添加到了index暂存区,使用commit能够实现将暂存区的文件提交到本地仓库。
# 提交暂存区到仓库区 $ git commit -m [message] # 提交暂存区的指定文件到仓库区 $ git commit [file1] [file2] ... -m [message] # 提交工做区自上次commit以后的变化,直接到仓库区,跳过了add,对新文件无效 $ git commit -a # 提交时显示全部diff信息 $ git commit -v # 使用一次新的commit,替代上一次提交 # 若是代码没有任何新变化,则用来改写上一次commit的提交信息 $ git commit --amend -m [message] # 重作上一次commit,并包括指定文件的新变化 $ git commit --amend [file1] [file2] ...
示例:
提交前的状态
提交:
提交后的状态:
从上图中能够看出暂存区中没有了bar.htm
修订提交
若是咱们提交事后发现有个文件改错了,或者只是想修改提交说明,这时能够对相应文件作出修改,将修改过的文件经过"git add"添加到暂存区,而后执行如下命令:
#修订提交 git commit --amend
撤销提交(commit)
原理就是放弃工做区和index的改动,同时HEAD指针指向前一个commit对象
#撤销上一次的提交 git reset --hard HEAD~1
要经过git log查看提交日志,也可直接指定提交编号或序号
示例:
撤销提交
git revert <commit-id>
这条命令会把指定的提交的全部修改回滚,并同时生成一个新的提交。
查看提交日志可使用git log指令,语法格式以下:
#查看提交日志 git log [<options>] [<revision range>] [[\--] <path>…]
示例:
"git log --graph"以图形化的方式显示提交历史的关系,这就能够方便地查看提交历史的分支信息,固然是控制台用字符画出来的图形。
"git log -1"则表示显示1行。
使用history能够查看您在bash下输入过的指令:
几乎全部输入过的都被记录下来的,不愧是作版本控制的。
查看全部分支日志
"git reflog"中会记录这个仓库中全部的分支的全部更新记录,包括已经撤销的更新。
使用git ls-files指令能够查看指定状态的文件列表,格式以下:
#查看指定状态的文件 git ls-files [-z] [-t] [-v] (--[cached|deleted|others|ignored|stage|unmerged|killed|modified])* (-[c|d|o|i|s|u|k|m])*
示例:
1)、撤销暂存区更新
使用"git add"把更新提交到了暂存区。这时"git status"的输出中提示咱们能够经过"git reset HEAD <file>..."把暂存区的更新移出到WorkSpace中
示例:f6已经提交,工做区修改,暂存区修改,撤销
2)、撤销本地仓库更新
使用git log查看提交日志
撤销提交有两种方式:使用HEAD指针和使用commit id
在Git中,有一个HEAD指针指向当前分支中最新的提交。当前版本,咱们使用"HEAD^",那么再钱一个版本可使用"HEAD^^",若是想回退到更早的提交,可使用"HEAD~n"。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2)
git reset --hard HEAD^ git reset --hard HEAD~1 git reset --59cf9334cf957535cb328f22a1579b84db0911e5
示例:回退到添加f6
回退前:
回退后:
如今又想恢复被撤销的提交可用"git reflog"查看仓库中全部的分支的全部更新记录,包括已经撤销的更新,撤销方法与前面同样。
git reset --hard HEAD@{7} git reset --hard e0e79d7
--hard:撤销并删除相应的更新
--soft:撤销相应的更新,把这些更新的内容放到Stage中
1)、删除未跟踪文件
若是文件仍是未跟踪状态,直接删除文件就可了,bash中使用rm能够删除文件,示例以下:
2)、删除已提交文件
-f 强制删除,物理删除了,同时删除工做区和暂存区中的文件
撤销删除:
#to discard changes in working directory git checkout -- <file>...
3)、删除暂存区的文件,不删除工做区的文件
使用git reset HEAD <file>...一样能够实现上面的功能
Git很强大,很灵活,这是毋庸置疑的。但也正由于它的强大形成了它的复杂,所以会有不少奇奇怪怪的问题出现,多用就行了。
分支在GIT中相对较难
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另外一个你正在另外一个平行宇宙里努力学习SVN。
若是两个平行宇宙互不干扰,那对如今的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!
分支在实际中有什么用呢?假设你准备开发一个新功能,可是须要两周才能完成,第一周你写了50%的代码,若是马上提交,因为代码还没写完,不完整的代码库会致使别人不能干活了。若是等代码所有写完再一次提交,又存在丢失天天进度的巨大风险。
如今有了分支,就不用怕了。你建立了一个属于你本身的分支,别人看不到,还继续在原来的分支上正常工做,而你在本身的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工做。
Git分支的速度很是快。
截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来讲不是指向提交,而是指向master,master才是指向提交的,因此,HEAD指向的就是当前分支。
git分支中经常使用指令:
# 列出全部本地分支 $ git branch # 列出全部远程分支 $ git branch -r # 列出全部本地分支和远程分支 $ git branch -a # 新建一个分支,但依然停留在当前分支 $ git branch [branch-name] # 新建一个分支,并切换到该分支 $ git checkout -b [branch] # 新建一个分支,指向指定commit $ git branch [branch] [commit] # 新建一个分支,与指定的远程分支创建追踪关系 $ git branch --track [branch] [remote-branch] # 切换到指定分支,并更新工做区 $ git checkout [branch-name] # 切换到上一个分支 $ git checkout - # 创建追踪关系,在现有分支与指定的远程分支之间 $ git branch --set-upstream [branch] [remote-branch] # 合并指定分支到当前分支 $ git merge [branch] # 选择一个commit,合并进当前分支 $ git cherry-pick [commit] # 删除分支 $ git branch -d [branch-name] # 删除远程分支 $ git push origin --delete [branch-name] $ git branch -dr [remote/branch]
默认分支是这样的,master是主分支
1)、新建一个分支,但依然停留在当前分支,使用:$ git branch [branch-name]
切换分支到dev1后的结果:
当咱们建立新的分支,例如dev
时,Git新建了一个指针叫dev
,指向master
相同的提交,再把HEAD
指向dev
,就表示当前分支在dev
上:
你看,Git建立一个分支很快,由于除了增长一个dev
指针,改改HEAD
的指向,工做区的文件都没有任何变化!
不过,从如今开始,对工做区的修改和提交就是针对dev
分支了,好比新提交一次后,dev
指针往前移动一步,而master
指针不变:
假如咱们在dev
上的工做完成了,就能够把dev
合并到master
上。Git怎么合并呢?最简单的方法,就是直接把master
指向dev
的当前提交,就完成了合并:
因此Git合并分支也很快!就改改指针,工做区内容也不变!
合并完分支后,甚至能够删除dev
分支。删除dev
分支就是把dev
指针给删掉,删掉后,咱们就剩下了一条master
分支:
2)、切换分支,git branch <name>,若是name为-则为上一个分支
切换为上一个分支
3)、新建一个分支,并切换到该分支,$ git checkout -b [branch]
4)、新建一个分支,指向指定commit使用命令:$ git branch [branch] [commit]
上面建立了dev3分支且指向了master中首次提交的位置,切换到dev3查看日志以下:
master上原本有两个提交记录的,此时的dev3指向的是第1次提交的位置
5)、新建一个分支,与指定的远程分支创建追踪关系使用命令:$ git branch --track [branch] [remote-branch]
1)、列出全部本地分支使用$ git branch
2)、列表全部远程分支使用$ git branch -r
3)、列出全部本地分支和远程分支使用$ git branch -a
合并指定分支到当前分支使用指令$ git merge [branch]
这里的合并分支就是对分支的指针操做,咱们先建立一个分支再合并到主分支:
这里的file11.txt主分支与dev6的内容如今是不一样的,由于在dev6中已被修改过,咱们可使用指令查看:
如今咱们将dev6合并到主分支中去,从下图中能够看出dev6中有一次提交,而master并无
合并后在master上查看file11.txt文件内容与dev6上的内容就同样了,合并后dev6中多出的提交在master也拥有了。
若是同一个文件在合并分支时都被修改了则会引发冲突,以下所示:
提交前两个分支的状态
在dev6分支中一样修改file11.txt
dev6与master分支中file11.txt文件都被修改且提交了,如今合并分支
提示冲突,如今咱们看看file11.txt在master分支中的状态
Git用<<<<<<<,=======,>>>>>>>标记出不一样分支的内容,其中<<<HEAD是指主分支修改的内容,>>>>>dev6 是指dev6上修改的内容
解决的办法是咱们能够修改冲突文件后从新提交,请注意当前的状态产master | MERGING:
从新提交后冲突解决:
手动解决完冲突后就能够把此文件添 加到索引(index)中去,用git commit命令来提交,就像平时修改了一个文件 同样。
用git log --graph命令能够看到分支合并图。
分支策略
master主分支应该很是稳定,用来发布新版本,通常状况下不容许在上面工做,工做通常状况下在新建的dev分支上工做,工做完后,好比上要发布,或者说dev分支代码稳定后能够合并到主分支master上来。
删除本地分支可使用命令:$ git branch -d [branch-name],-D(大写)强制删除
删除远程分支可使用以下指令:
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
-d表示删除分支。分支必须彻底合并在其上游分支,或者在HEAD上没有设置上游
-r表示远程的意思remotes,若是-dr则表示删除远程分支
经过命令行能够深入的理解Git,Git GUI或IDE插件却能够更加直观操做Git,经常使用的Git GUI有以下这些:
全球开发人员交友俱乐部提供的强大工具,功能完善,使用方便。对于使用GitHub的开发人员来讲是很是便捷的工具。
GitHub for Desktop不带三方合并工具,你必须本身手动解决冲突才能够。
– 免费
– 同时支持 Windows 和 Mac:对于须要常常在不一样的操做系统间切换的开发人员来讲很是方便。
– 漂亮的界面:做为天天盯着看的工具,颜值是很是重要的
– 支持Pull Request:直接从客户端提交PR,很方便
– Timeline 支持:直接在时间线上显示每次提交的时间点和大小
– 支持git LFS:存储大文件更加节省空间和高效
– 不支持三方合并:须要借助第三方工具才行
SourceTree是老牌的Git GUI管理工具了,也号称是最好用的Git GUI工具。强大,功能丰富,基本操做和高级操做都设计得很是流畅,适合初学者上手,支持Git Flow。
– 免费
– 功能强大:不管你是新手仍是重度用户,SourceTree 都会让你以为很顺手。对于很是重度用户,Source Tree还支持自定义脚本的执行。
– 同时支持 Windows 和 Mac 操做系统
– 同时支持 Git 和 Mercurial 两种 VCS
– 内置GitHub, BitBucket 和 Stash 的支持:直接绑定账号便可操做远程repo
小乌龟,SVN的超普遍使用也使得这个超好用的Svn客户端成了几乎每一个开发人员的桌面必备软件。小乌龟只提供Windows版本,提供中文版支持的。
– 免费
– 只支持Windows操做系统:与文件管理器的良好集成
– 中文界面
– 与TortoiseSVN一脉相承的操做体验
安装Git时会集成安装Gui工具,在Git菜单下能够找到,特色是:免费、简单、不须要额外安装
对于使用IDE进行开发的程序员来讲,能够不离开经常使用的IDE就直接操做源代码管理系统是最好的选择,如下是我对几个常见的IDE集成的git客户端:
做为Java集成开发环境的表明,Eclipse内置了egit这个插件来提供git的集成支持。实话实说,这个插件的功能很是丰富,不管是普通的clone, commit, pull/push操做;仍是复杂一些的git flow都有支持。
VS里面的Git支持已经至关的完善。直接克隆github上的repo
1)、帮助文档
完整的安装了Git后有一个官方帮助,这是最权威的资料,方法以下:
好比咱们要查看git commit的使用
执行时会打开对应的git帮助文档,其实就在本地,固然您也能够去官网在线搜索,地址是: https://git-scm.com/docs。
2)、信息查看与统计命令
#统计某人的代码提交量,包括增长,删除: git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' - #仓库提交者排名前 5(若是看所有,去掉 head 管道便可): git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5 #仓库提交者(邮箱)排名前 5:这个统计可能不会太准,由于不少人有不一样的邮箱,但会使用相同的名字 git log --pretty=format:%ae | gawk -- '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }' | sort -u -n -r | head -n 5 #贡献者统计: git log --pretty='%aN' | sort -u | wc -l #提交数统计: git log --oneline | wc -l # 显示有变动的文件 $ git status # 显示当前分支的版本历史 $ git log # 显示commit历史,以及每次commit发生变动的文件 $ git log --stat # 搜索提交历史,根据关键词 $ git log -S [keyword] # 显示某个commit以后的全部变更,每一个commit占据一行 $ git log [tag] HEAD --pretty=format:%s # 显示某个commit以后的全部变更,其"提交说明"必须符合搜索条件 $ git log [tag] HEAD --grep feature # 显示某个文件的版本历史,包括文件更名 $ git log --follow [file] $ git whatchanged [file] # 显示指定文件相关的每一次diff $ git log -p [file] # 显示过去5次提交 $ git log -5 --pretty --oneline # 显示全部提交过的用户,按提交次数排序 $ git shortlog -sn # 显示指定文件是什么人在什么时间修改过 $ git blame [file] # 显示暂存区和工做区的差别 $ git diff # 显示暂存区和上一个commit的差别 $ git diff --cached [file] # 显示工做区与当前分支最新commit之间的差别 $ git diff HEAD # 显示两次提交之间的差别 $ git diff [first-branch]...[second-branch] # 显示今天你写了多少行代码 $ git diff --shortstat "@{0 day ago}" # 显示某次提交的元数据和内容变化 $ git show [commit] # 显示某次提交发生变化的文件 $ git show --name-only [commit] # 显示某次提交时,某个文件的内容 $ git show [commit]:[filename] # 显示当前分支的最近几回提交 $ git reflog
示例:
Git是分布式版本控制系统,同一个Git仓库,能够分布到不一样的机器上,但开发参与者必须在同一个网络中,且必须有一个项目的原始版本,一般的办法是让一台电脑充当服务器的角色,天天24小时开机,其余每一个人都从这个“服务器”仓库克隆一份到本身的电脑上,而且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。彻底能够本身搭建一台运行Git的服务器但如今更适合的作法是使用免费的托管平台。
同时相较于传统的代码都是管理到本机或者内网。 一旦本机或者内网机器出问题,代码可能会丢失,使用远端代码仓库将永远存在一个备份。同时也免去了搭建本地代码版本控制服务的繁琐。 云计算时代 Git 以其强大的分支和克隆功能,更加方便了开发者远程协做。
Git代码托管平台,首先推荐的是GitHub,好多好的开源项目都来自GitHub,可是GitHub只能新建公开的Git仓库,私有仓库要收费,有时候访问比较卡,若是你作的是一个开源项目,能够首选GitHub。下面推荐几个比较好的Git代码托管平台:
关于GItHub相信你们都有耳闻,我就不详细介绍了。GitHub地址: https://github.com/,其首页如图:
对于有些人,提到GitHub就会天然的想到Gitlab,Gitlab支持无限的公有项目和私有项目。Gitlab地址: https://about.gitlab.com/,其首页截图如图:
bitbucket免费支持5个开发成员的团队建立无限私有代码托管库。bitbucket地址:
开源中国一个帐号最多能够建立1000个项目,包含公有和私有,开源中国代码托管地址: http://git.oschina.net/,其首页如图:
谈到coding.net,首先必须提的是速度快,功能与开源中国类似,一样一个帐号最多能够建立1000个项目(5个私有),也支持任务的建立等。coding.net地址: https://coding.net/:
我我的比较推荐Coding.net、GItHub。
固然还有许多,如CSDN,百度,阿里等,欢迎你们比较后推荐。
选择国外的主机请考虑网速,选择国内的主机请考虑稳定与安全性。
由于coding.net免费,能够建立私有项目,且速度不错,这里咱们以coding.net为托管平台完成远程仓库的账号申请与操做。
1)、打开 https://coding.net/,点击右上角的注册按钮:
2)、填写好注册信息经过邮箱或手机验证后注册就成功了。登陆到我的首页。
若是是QQ邮箱请注意激活邮件可能会被当着垃圾邮件,到垃圾箱中能够找到。
登陆成功后,点击左侧菜单项目,点击加号新建项目,这里建立的是一个公开项目,没有Readme.md、许可证与忽视文件,缘由是若是你本地已经有一个项目了,想提交到远程仓库而新建立的3个文件本地没有,固然有办法但初学避免麻烦这里我就不添加这三个文件了,输入相关信息后点击建立就成功了。
从上图能够看出建立地址有两种:
https 类型的:https://git.coding.net/zhangguoGit/project7.git
SSH类型的:git@git.coding.net:zhangguoGit/project7.git
使用加密的网页访问通道读写仓库,使用用户名及密码进行鉴权。 避免重复输入密码,查看 怎样在每次 Push 时不用重复输入密码?
提示:Git 用户名为 Coding 的帐户邮箱或者个性后缀,密码为 Coding 的帐户密码。
注意:HTTPS 方式 push 大文件可能引起错误,查看 Push 出错怎么办?
SSH全称(Secure SHell)是一种网络协议,顾名思义就是很是安全的shell,主要用于计算机间加密传输。
使用加密通道读写仓库,无单次上传限制,需先设置 “帐户 SSH 公钥”,完成配对验证。
导入仓库能够将已存在的Git项目或SVN项目直接导入。
在命令行建立项目:
#一、建立目录 mkdir project7 #二、进入目录 cd project7 #三、初始化目录为git项目 git init #四、建立md文件追加内容# project7(一级标题) echo "# project7" >> README.md #五、添加说明文件到暂存区 git add README.md #六、提交到本地仓库并写日志 git commit -m "first commit" #七、添加远程主机,主机名为origin 地址为https://git.coding.net/zhangguoGit/project7.git git remote add origin https://git.coding.net/zhangguoGit/project7.git #八、本地的master分支推送到origin主机,同时指定origin为默认主机,后面就能够不加任何参数使用git push了,-u 参数指定一个默认主机 git push -u origin master
若是建立已经建立则只须要第7步与第8步就行了。
Markdown 是一种轻量级标记语言,它容许人们“使用易读易写的纯文本格式编写文档,而后转换成有效的XHTML(或者HTML)文档。
Markdown 语法的目标是:成为一种适用于网络的书写语言。
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
####### 七级标题
效果:
分为有序列表和无序列表。
有序列表
1. 1
2. 2
3. 3
无序列表
* 1
* 2
* 3
> 这是引用
二者格式区别在于“ ! ”。

[连接描述](连接地址)
**这是粗体**
*这是斜体*
| Tables | Are | Cool |
| ------------ |:------------:| -----:|
| col 3 is | right-aligned| $1600 |
| col 2 is | centered | $12 |
| zebra stripes| are neat | &1 |
用``这个把代码包裹起来
输入***
便可。
示例:
对应的HTML:
结果:
在线实时预览工具
申请到了Git远程仓库的账号并建立了一个空的远程仓库如今咱们就能够结合本地的仓库与远程仓库一块儿协同工做了,模拟多人协同开发,这里咱们所有使用命令完成。
# 下载远程仓库的全部变更 $ git fetch [remote] # 显示全部远程仓库 $ git remote -v # 显示某个远程仓库的信息 $ git remote show [remote] # 增长一个新的远程仓库,并命名 $ git remote add [shortname] [url] # 取回远程仓库的变化,并与本地分支合并 $ git pull [remote] [branch] # 上传本地指定分支到远程仓库 $ git push [remote] [branch] # 强行推送当前分支到远程仓库,即便有冲突 $ git push [remote] --force # 推送全部分支到远程仓库 $ git push [remote] --all #简单查看远程---全部仓库 git remote (只能查看远程仓库的名字)
#查看单个仓库 git remote show [remote-branch-name] #新建远程仓库 git remote add [branchname] [url] #修改远程仓库 git remote rename [oldname] [newname] #删除远程仓库 git remote rm [remote-name] #获取远程仓库数据 git fetch [remote-name] (获取仓库全部更新,但不自动合并当前分支) git pull (获取仓库全部更新,并自动合并到当前分支) #上传数据,如git push origin master git push [remote-name] [branch]
远程操做的第一步,一般是从远程主机克隆一个版本库,这时就要用到git clone
命令。
$ git clone <版本库的网址>
好比,克隆一个上课示例的版本库。
$ git clone https://github.com/zhangguo5/AngularJS04_BookStore.git
该命令会在本地主机生成一个目录,与远程主机的版本库同名。若是要指定不一样的目录名,能够将目录名做为git clone
命令的第二个参数。
$ git clone <版本库的网址> <本地目录名>
git clone
支持多种协议,除了HTTP(s)之外,还支持SSH、Git、本地文件协议等,下面是一些例子。
$ git clone http[s]://example.com/path/to/repo.git/ $ git clone ssh://example.com/path/to/repo.git/ $ git clone git://example.com/path/to/repo.git/ $ git clone /opt/git/project.git $ git clone file:///opt/git/project.git $ git clone ftp[s]://example.com/path/to/repo.git/ $ git clone rsync://example.com/path/to/repo.git/
SSH协议还有另外一种写法。
$ git clone [user@]example.com:path/to/repo.git/
一般来讲,Git协议下载速度最快,SSH协议用于须要用户认证的场合。各类协议优劣的详细讨论请参考 官方文档。
示例:
结果:
为了便于管理,Git要求每一个远程主机都必须指定一个主机名。git remote
命令就用于管理主机名。
不带选项的时候,git remote
命令列出全部远程主机。
$ git remote
使用-v
选项,能够参看远程主机的网址。
$ git remote -v
上面命令表示,当前只有一台远程主机,叫作origin,以及它的网址。
克隆版本库的时候,所使用的远程主机自动被Git命名为origin
。若是想用其余的主机名,须要用git clone
命令的-o
选项指定。
$ git clone -o WeUI https://github.com/Tencent/weui.git $ git remote
上面命令表示,克隆的时候,指定远程主机叫作WeUI。
git remote show
命令加上主机名,能够查看该主机的详细信息。
$ git remote show <主机名>
git remote add
命令用于添加远程主机。
$ git remote add <主机名> <网址>
git remote rm
命令用于删除远程主机。
$ git remote rm <主机名>
git remote rename
命令用于远程主机的更名。
$ git remote rename <原主机名> <新主机名>
一旦远程主机的版本库有了更新(Git术语叫作commit),须要将这些更新取回本地,这时就要用到git fetch
命令。
$ git fetch <远程主机名>
上面命令将某个远程主机的更新,所有取回本地。
git fetch
命令一般用来查看其余人的进程,由于它取回的代码对你本地的开发代码没有影响。
默认状况下,git fetch
取回全部分支(branch)的更新。若是只想取回特定分支的更新,能够指定分支名。
$ git fetch <远程主机名> <分支名>
好比,取回origin
主机的master
分支。
$ git fetch origin master
所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。好比origin
主机的master
,就要用origin/master
读取。
git branch
命令的-r
选项,能够用来查看远程分支,-a
选项查看全部分支。
$ git branch -r origin/master $ git branch -a * master remotes/origin/master
上面命令表示,本地主机的当前分支是master
,远程分支是origin/master
。
取回远程主机的更新之后,能够在它的基础上,使用git checkout
命令建立一个新的分支。
$ git checkout -b newBrach origin/master
上面命令表示,在origin/master
的基础上,建立一个新分支。
此外,也可使用git merge
命令或者git rebase
命令,在本地分支上合并远程分支。
$ git merge origin/master # 或者 $ git rebase origin/master
上面命令表示在当前分支上,合并origin/master
。
git pull
命令的做用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
$ git pull <远程主机名> <远程分支名>:<本地分支名>
好比,取回origin
主机的next
分支,与本地的master
分支合并,须要写成下面这样。
$ git pull origin next:master
若是远程分支是与当前分支合并,则冒号后面的部分能够省略。
$ git pull origin next
上面命令表示,取回origin/next
分支,再与当前分支合并。实质上,这等同于先作git fetch
,再作git merge
。
$ git fetch origin $ git merge origin/next
在某些场合,Git会自动在本地分支与远程分支之间,创建一种追踪关系(tracking)。好比,在git clone
的时候,全部本地分支默认与远程主机的同名分支,创建追踪关系,也就是说,本地的master
分支自动"追踪"origin/master
分支。
Git也容许手动创建追踪关系。
git branch --set-upstream master origin/next
上面命令指定master
分支追踪origin/next
分支。
若是当前分支与远程分支存在追踪关系,git pull
就能够省略远程分支名。
$ git pull origin
上面命令表示,本地的当前分支自动与对应的origin
主机"追踪分支"(remote-tracking branch)进行合并。
若是当前分支只有一个追踪分支,连远程主机名均可以省略。
$ git pull
上面命令表示,当前分支自动与惟一一个追踪分支进行合并。
若是合并须要采用rebase模式,可使用--rebase
选项。
$ git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
若是远程主机删除了某个分支,默认状况下,git pull
不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,因为其余人操做了远程主机,致使git pull
不知不觉删除了本地分支。
可是,你能够改变这个行为,加上参数 -p
就会在本地删除远程已经删除的分支。
$ git pull -p # 等同于下面的命令 $ git fetch --prune origin $ git fetch -p
git push
命令用于将本地分支的更新,推送到远程主机。它的格式与git pull
命令相仿。
$ git push <远程主机名> <本地分支名>:<远程分支名>
注意,分支推送顺序的写法是<来源地>:<目的地>,因此git pull
是<远程分支>:<本地分支>,而git push
是<本地分支>:<远程分支>。
若是省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(一般二者同名),若是该远程分支不存在,则会被新建。
$ git push origin master
上面命令表示,将本地的master
分支推送到origin
主机的master
分支。若是后者不存在,则会被新建。
若是省略本地分支名,则表示删除指定的远程分支,由于这等同于推送一个空的本地分支到远程分支。
$ git push origin :master # 等同于 $ git push origin --delete master
上面命令表示删除origin
主机的master
分支。
若是当前分支与远程分支之间存在追踪关系,则本地分支和远程分支均可以省略。
$ git push origin
上面命令表示,将当前分支推送到origin
主机的对应分支。
若是是新建分支第一次push,会提示:
fatal: The current branch dev1 has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin dev1
输入这行命令,而后输入用户名和密码,就push成功了。
之后的push就只须要输入git push origin
缘由是:
#由于在git的全局配置中,有一个push.default属性,其决定了git push操做的默认行为。在Git 2.0以前,这个属性的默认被设为'matching',2.0以后则被更改成了'simple'。 #咱们能够经过git version肯定当前的git版本(若是小于2.0,更新是个更好的选择),经过git config --global push.default 'option'改变push.default的默认行为(或者也可直接编辑~/.gitconfig文件)。 push.default 有如下几个可选值: nothing, current, upstream, simple, matching 其用途分别为: nothing - push操做无效,除非显式指定远程分支,例如git push origin develop(我以为。。。能够给那些不肯学git的同事配上此项)。 current - push当前分支到远程同名分支,若是远程同名分支不存在则自动建立同名分支。 upstream - push当前分支到它的upstream分支上(这一项其实用于常常从本地分支push/pull到同一远程仓库的情景,这种模式叫作central workflow)。 simple - simple和upstream是类似的,只有一点不一样,simple必须保证本地分支和它的远程 upstream分支同名,不然会拒绝push操做。 matching - push全部本地和远程两端都存在的同名分支。
所以若是咱们使用了git2.0以前的版本,push.default = matching,git push后则会推送当前分支代码到远程分支,而2.0以后,push.default = simple,若是没有指定当前分支的upstream分支,就会收到上文的fatal提示。
若是当前分支只有一个追踪分支,那么主机名均可以省略。
$ git push
若是当前分支与多个主机存在追踪关系,则可使用-u
选项指定一个默认主机,这样后面就能够不加任何参数使用git push
。
$ git push -u origin master
上面命令将本地的master
分支推送到origin
主机,同时指定origin
为默认主机,后面就能够不加任何参数使用git push
了。
不带任何参数的git push
,默认只推送当前分支,这叫作simple方式。此外,还有一种matching方式,会推送全部有对应的远程分支的本地分支。Git 2.0版本以前,默认采用matching方法,如今改成默认采用simple方式。若是要修改这个设置,能够采用git config
命令。
$ git config --global push.default matching # 或者 $ git config --global push.default simple
还有一种状况,就是无论是否存在对应的远程分支,将本地的全部分支都推送到远程主机,这时须要使用--all
选项。
$ git push --all origin
上面命令表示,将全部本地分支都推送到origin
主机。
若是远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地作git pull
合并差别,而后再推送到远程主机。这时,若是你必定要推送,可使用--force
选项。
$ git push --force origin
上面命令使用--force
选项,结果致使远程主机上更新的版本被覆盖。除非你很肯定要这样作,不然应该尽可能避免使用--force
选项。
最后,git push
不会推送标签(tag),除非使用--tags
选项。
$ git push origin --tags
假定咱们建立好了一个远程仓库地址为:https://coding.net/u/zhangguo5/p/project7/git,如今咱们在本地建立一个项目并同步到远程仓库中。
1)、建立文件添加到暂存区
2)、提交到本地仓库
3)、提交到远程仓库
添加远程主机地址:
推送文件:
结果:
说明:这里我使用的是SSH方式提交的,全部并无让我输入用户名与密码,若是你使用https方式提交则要配置用户名与邮箱,还要输入密码。
资料连接: https://pan.baidu.com/s/1c20DVOW 密码: p9ri