赞
踩
Git大全:https://gitee.com/all-about-git
Git命令学习:https://oschina.gitee.io/learn-git-branching/
许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。
为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。
版本控制的作用:
简单说就是用于管理多人协同开发项目的技术。
同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。
Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。
Linux社区中存在很多的大佬!破解研究 BitKeeper !
所以到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。(2周左右!) 也就是后来的 Git!
Git是目前世界上最先进的分布式版本控制系统。
Git是免费、开源的,最初Git是为辅助 Linux 内核开发的,来替代 BitKeeper!
Linux和Git之父李纳斯·托沃兹(Linus Benedic Torvalds)1969、芬兰
软件下载 + 技巧
打开 Git 官网,下载 Git 对应操作系统的版本。
所有东西下载慢的话就可以去找镜像!https://npm.taobao.org/mirrors
官网下载太慢,我们可以使用淘宝镜像下载:http://npm.taobao.org/mirrors/git-for-windows/
先卸载
直接反安装即可,然后清理环境变量
下载对应的版本即可安装!
安装git for windows:无脑下一步即可!安装完毕就可以使用了!
全局变量只是为了全局使用而已!
安装TortoiseGit:小乌龟(图形化界面)最好不安装用命令
一路“下一步”使用默认选项即可。
说明:
由于目前只有英文语言包,默认即可继续下一步。
配置git.exe,在之前中已经安装过git-for-windows了所以在此找到git.exe所在的目录。
配置开发者姓名及邮箱,每次提交代码时都会把此信息包含到提交的信息中。
使用默认配置,点击“完成”按钮完成配置。
安装中文语言包并不是必选项。可以根据个人情况来选择安装。
启动Git
安装成功后在开始菜单中会有Git项,菜单下有3个程序:任意文件夹下右键也可以看到对应的程序!
Git Bash:Unix与Linux风格的命令行,使用最多,推荐最多;清屏:clear
Git CMD:Windows风格的命令行;清屏:cls
Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令!
基本的Linux命令
**cd** : 改变目录。
**cd** **. .** 回退到上一个目录,直接cd进入默认目录
**pwd** : 显示当前所在的目录路径。
**ls(ll)**: 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。
**touch** : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。
**rm**: 删除一个文件, rm index.js 就会把index.js文件删除。
**mkdir**: 新建一个目录,就是新建一个文件夹。
**rm -r** : 删除一个文件夹, rm -r src 删除src目录, 好像不能用通配符。
**mv** 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。
**reset** 重新初始化终端/清屏。
**clear** 清屏。
**history** 查看命令历史。
**help** 帮助。
**exit** 退出。
**#** 表示注释
**echo输出与注释**
**cat 显示文件内容**
所有的配置文件都保存在本地
查看配置信息
#查看配置信息
$ git config -l
#查看系统config
git config --system --list
#查看当前用户(global)配置
git config --global --list
Git相关的配置文件:
这里可以直接编辑配置文件,通过命令设置后会响应到这里。
设置用户名与邮箱(用户标识,必要)
当你安装 Git 后首先要做的事情是设置 yourname 和 youremail 地址。这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中:
git config --global user.name "yourname" #名称
git config --global user.email "youremail" #邮箱
这里的yourname输入你的GitHub用户名,youremail输入你GitHub的邮箱。这样GitHub才能知道你是不是对应它的账户。
只需要做一次这个设置,如果你传递了–global 选项,因为Git将总是会使用该信息来处理你在系统中所做的一切操作。如果你希望在一个特定的项目中使用不同的名称或e-mail地址,你可以在该项目中运行该命令而不要–global选项。总之–global为全局配置,不加为某个项目的特定配置。
工作区域
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
**Workspace:**工作区,就是你平时存放项目代码的地方
**Index / Stage:**暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
**Repository:**仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
**Remote:**远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
本地的三个区域确切的说应该是git仓库中HEAD指向的版本
Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
.git:存放Git管理信息的目录,初始化仓库的时候自动创建。
Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。
工作流程
Git 的工作流程一般是这样的:
1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git仓库。
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
创建工作目录与常用指令
工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。
日常使用只要记住下图6个命令:
- 本地仓库搭建
创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。
# 在当前目录新建一个Git代码库
$ git init
执行后可以看到,仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录里面。
- 克隆远程仓库
另一种方式是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地!
# 克隆一个项目和它的整个代码历史(版本信息)
$ git clone [url] # https://gitee.com/kuangstudy/openclass.git
去 gitee 或者 github 上克隆一个测试!
文件的四种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
git add.
状态变为Staged
.Modified
. 如果使用git rm
移出版本库, 则成为Untracked
文件git add
可进入暂存staged
状态, 使用git checkout
则丢弃修改过, 返回到unmodify
状态, 这个git checkout
即从库中取出文件, 覆盖当前修改 !git commit -
则将修改同步到库中, 这时库中的文件和本地文件又变为一致,文件为Unmodify
状态。执行git reset HEAD filename
取消暂存, 文件状态为Modified
查看文件状态
上面说文件有4种状态,通过如下命令可以查看到文件的状态:
#查看指定文件状态
git status [filename]
#查看所有文件状态
git status
#添加所有文件到暂存区
git add .
# 提交暂存区中的内容到本地仓库 -m 提交信息
git commit -m "消息内容"
# 将本地仓库中内容提交到远程仓库
git push
忽略文件
忽略文件的原则是:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
在主目录下建立.gitignore
文件,此文件有如下规则:
#为注释
*.txt #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt #但lib.txt除外
/temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/ #忽略build/目录下的所有文件
doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
示例:IDEA的 “.gitignore”
文件中设置忽略的文件:
*.class
*.1og
*.1ock
# Package Files #
*.jar
*.war
*.ear
target/
# idea
.idea/
*.iml
*velocity.1og*
### STS ###
.apt_ generated
.factorypath
.springBeans
### IntelliJ IDEA ###
*.iml
*.ipr
*.iws
.idea
.classpath
.project
.settings/
bin/
*.1og
tmp/
#rebel
*rebel.xml*
使用GitHub和Gitee(码云)创建仓库的步骤一样
Gitee:https://gitee.com/
(免密码登录,这一步挺重要的,码云是远程仓库,我们是平时工作在本地仓库!)
# 进入 C:\Users\Administrator\.ssh 目录
# 生成公钥
ssh-keygen -t rsa
生成完之后在.ssh路径下产生对应的文件
id_rsa是私钥
id_rsa.pub是公钥
将SSH公钥添加至码云
许可证:**(GPL-3.0)**开源是否可以随意转载,开源但是不能商业使用,不能转载,…限制等!
$ git clone [url]
将克隆下来的文件复制到项目中即可使用git,提交会弹出GitHub/Gitee的登录提示
方法一:创建项目目录直接到git目录下
方法二(推荐):将远程git文件目录拷贝到项目中即可
在版本回退里,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master
分支。HEAD
严格来说不是指向提交,而是指向master
,master
才是指向提交的,所以,HEAD
指向的就是当前分支。
一开始的时候,master
分支是一条线,Git用master
指向最新的提交,再用HEAD
指向master
,就能确定当前分支,以及当前分支的提交点:
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:
当我们创建新的分支,例如dev
时,Git新建了一个指针叫dev
,指向master
相同的提交,再把HEAD
指向dev
,就表示当前分支在dev
上:
你看,Git创建一个分支很快,因为除了增加一个dev
指针,改改HEAD
的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev
分支了,比如新提交一次后,dev
指针往前移动一步,而master
指针不变:
假如我们在dev
上的工作完成了,就可以把dev
合并到master
上。Git怎么合并呢?最简单的方法,就是直接把master
指向dev
的当前提交,就完成了合并:
所以Git合并分支也很快!就改改指针,工作区内容也不变!
合并完分支后,甚至可以删除dev
分支。删除dev
分支就是把dev
指针给删掉,删掉后,我们就剩下了一条master
分支:
真是太神奇了,你看得出来有些提交是通过分支完成的吗?
在GitHub/Gitee邀请合作开发即可多人协作
首先,我们创建dev
分支,然后切换到dev
分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后,用git branch
命令查看当前分支:
$ git branch
* dev
master
git branch
命令会列出所有分支,当前分支前面会标一个*
号。
然后,我们就可以在dev
分支上正常提交,比如对readme.txt做个修改,加上一行:
create new branch dev..
然后提交:
$ git add readme.txt
$ git commit -m "create new branch...."
[dev 45ae9a9] create new branch....
1 file changed, 1 insertion(+)
现在,dev
分支的工作完成,我们就可以切换回master
分支:
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
切换回master
分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev
分支上,而master
分支此刻的提交点并没有变:
现在,我们把dev
分支的工作成果合并到master
分支上:
$ git merge dev
Updating 90bc1f7..45ae9a9
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge
命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev
分支的最新提交是完全一样的。
注意到上面的Fast-forward
信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master
指向dev
的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward
,我们后面会讲其他方式的合并。
合并完成后,就可以放心地删除dev
分支了:
$ git branch -d dev
Deleted branch dev (was 45ae9a9).
删除后,查看branch
,就只剩下master
分支了:
$ git branch
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master
分支上工作效果是一样的,但过程更安全。
Git鼓励大量使用分支:
查看本地所有分支:git branch
查看远程所有分支:git branch -r
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
删除远程分支:
git push origin --delete [branch-name]
git branch -dr [remote/branch]
注意:在本地操作的分支是在本地创建的,并没有同步到远程,如果需要可以push远程分支进行管理
当前分支push到远程分支:
$ git push --set-upstream origin [远程分支名]
人生不如意之事十之八九,合并分支往往也不是一帆风顺的。
准备新的feature1
分支,继续我们的新分支开发:
$ git checkout -b feature1
Switched to a new branch 'feature1'
修改readme.txt最后一行,改为:
create new branch feature1..
在feature1
分支上提交:
$ git add readme.txt
$ git commit -m "create new branch feature1 first modify"
[feature1 b4309b0] create new branch feature1 first modify
1 file changed, 1 insertion(+)
切换到master
分支:
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Git还会自动提示我们当前master
分支比远程的master
分支要超前1个提交。
在master
分支上把readme.txt文件的最后一行改为:
goback master....
提交:
$ git add readme.txt
$ git commit -m "goback master first modify"
[master 0b56936] goback master first modify
1 file changed, 1 insertion(+)
现在,master
分支和feature1
分支各自都分别有新的提交,变成了这样:
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
果然冲突了!Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status
也可以告诉我们冲突的文件:
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
我们可以直接查看readme.txt的内容:
test git modify second
study git
three add
four add modify
five add modify
six add modify
seven add modify
eight add modify ...
create new branch dev..
<<<<<<< HEAD
goback master....
=======
create new branch feature1..
>>>>>>> feature1
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,我们修改如下后保存:
test git modify second
study git
three add
four add modify
five add modify
six add modify
seven add modify
eight add modify ...
create new branch dev..
create new branch feature1..
goback master....
再提交:
$ git add readme.txt
$ git commit -m "fixed conflicts"
[master 0f3d64a] fixed conflicts
现在,master
分支和feature1
分支变成了下图所示:
用带参数的git log
也可以看到分支的合并情况:
$ git log --graph --pretty=oneline --abbrev-commit
* 0f3d64a fixed conflicts
|\
| * b4309b0 create new branch feature1 first modify
* | 0b56936 goback master first modify
|/
* 45ae9a9 create new branch....
* 90bc1f7 test name
* c1bdf43 test commit
* dd34c9a no add but commit,because use other parameter
* 4ed30d1 eight modify dify
* b45ca96 eight modify
* 9332d40 seven modify
* 72c6f9b six modify
* f64b5a0 five modify
* de8fd65 four modify
* 83a4b1e three modify
* 01c05cf two modify
* 1acafa7 first modify
* 09c1bba first git
最后,删除feature1
分支:
$ git branch -d feature1
Deleted branch feature1 (was b4309b0).
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph
命令可以看到分支合并图。
学习参考:
https://www.git-scm.com/book/zh/v2
https://www.liaoxuefeng.com/wiki/896043488029600
https://www.cnblogs.com/matengfei123/p/8252128.html
https://www.bilibili.com/video/BV1FE411P7B3?p=1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。