Git是目前世界上最先进的分布式版本控制系统(没有之一)。
Git是分布式的,Git不需要有中心服务器,我们每台电脑拥有的东西都是一样的。我们使用Git并且有个 中心服务器,仅仅是为了方便交换大家的修改,但是这个服务器的地位和我们每个人的PC是一样的。我们可以 把它当做一个开发者的pc就可以就是为了大家代码容易交流不关机用的。没有它大家一样可以工作,只不 过“交换”修改不方便而已。 git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众 多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002 年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代 码。到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。 他们对新的系统制订 了若干目标: 速度简单的设计 对非线性开发模式的强力支持(允许成千上万个并行开发的分支) 完全分布式 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量),安装参见:安装链接
GitHub是一个基于Git的远程文件托管平台(同GitCafe、BitBucket和GitLab等)。
Git本身完全可以做到版本控制,但其所有内容以及版本记录只能保存在本机,如果想要将文件内容以及版本记录同时保存在远程,则需要结合GitHub来使用。使用场景:
无GitHub:在本地 .git 文件夹内维护历时文件
有GitHub:在本地 .git 文件夹内维护历时文件,同时也将历时文件托管在远程仓库
下载git的网址直达,进去后选择要下载的版本和需要安装的系统
下载完后得到如图
然后傻瓜式安装,一路next即可。
那么如何判断自己已经安装成功了呢?在桌面右击选择,如果可以看到里面的下面了两个图标,代表你已经安装成功了。
对上面两个的解释,我们学的linux指令都可以在这里的 Git Bash使用
当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用
该用户信息
命令如下:
git config --global user.name “xxx” //xxx指的是你的用户名
git config --global user.email "xxxx.@xx.com" //输入你的邮箱
3.查看配置信息
git config --global user.name //用来查看你的用户名
git config --global user.email //用来查看你的邮箱
有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。
touch ~/.bashrc
#用于输出git提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'#用于输出当前目录所有文件及基本信息alias ll='ls -al
git config --global core.quotepath false
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
不同点:
merge操作会生成一个新的节点,之前的提交分开显示。而rebase操作不会生成新的节点,是将两个分支融合成一个线性的提交。
解决冲突时。merge 操作遇到冲突的时候,当前 merge 不能继续进行下去。手动修改冲突内容后,add 修改,commit 就可以了。而rebase操作的话,会中断 rebase,同时会提示去解决冲突。解决冲突后,将修改 add 后执行git rebase –continue继续操作,或者git rebase –skip忽略冲突。
git pull和git pull --rebase区别:git pull做了两个操作分别是”获取”和”合并”。所以加了 rebase 就是以 rebase 的方式进行合并分支,默认为 merge。
总结:
merge 是一个合并操作,会将两个分支的修改合并在一起,默认操作的情况下会提交合并中修改的内容
merge 的提交历史忠实地记录了实际发生过什么,关注点在真实的提交历史上面
rebase 并没有进行合并操作,只是提取了当前分支的修改,将其复制在了目标分支的最新提交后面
rebase 的提交历史反映了项目过程中发生了什么,关注点在开发过程上面
merge 与 rebase 都是非常强大的分支整合命令,没有优劣之分,使用哪一个应由项目和团队的开发需求决定
merge 和 rebase 还有很多强大的选项,可以使用 git help 查看
git stash pop: 从 Git 栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个 Stash 的内容,所以用栈来管理,pop 会从最近的一个 stash 中读取内容并恢复。
git stash pop –index stash@{0}: 恢复编号为 0 的进度的工作区和暂存区。
git stash apply stash@{1} 以将你指定版本号为 stash@{1}的工作取出来
git stash drop[] 删除某一个进度,默认删除最新进度
git stash list: 显示 Git 栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空 Git 栈。此时使用 gitg 等图形化工具会发现,原来 stash 的哪些节点都消失了
恢复工作进度
git stash pop [–index] []
–index 参数:不仅恢复工作区,还恢复暂存区
指定恢复某一个具体进度。如果没有这个参数,默认恢复最新进度
这是git stash保存进度的完整命令形式
git stash [save message] [-k|–no-keep-index] [–patch]
-k和–no-keep-index指定保存进度后,是否重置暂存区
–patch 会显示工作区和HEAD的差异,通过编辑差异文件,排除不需要保存的内容。和git add -p命令类似
使用save可以对进度添加备注
git stash save “这是保存的进度”
8. Git 只从暂存区删除,从工作空间删除的命令分别是什么?
git rm --cached
git rm
git commit
列出现有的标签
git tag
打标签
git tag -a v1.01 -m “Relase version 1.01”
查看相应标签的版本信息
git show v1.4
-a 选项,创建一个含附注类型的标签
-m 选项,指定了对应的标签说明
查看本地分支
git branch
#查看远程分支
git branch -r
创建本地分支(注意新分支创建后不会自动切换为当前分支)
git branch [name]
切换分支
git checkout [name]
创建新分支并立即切换到新分支
git checkout -b [name]
强制删除一个分支
git branch -D [name]
合并分支(将名称为[name]的分支与当前分支合并)
git merge [name]
查看各个分支最后提交信息
git br -v
查看已经被合并到当前分支的分支
git br --merged
查看尚未被合并到当前分支的分支
git br --no-merged
介绍 Git 冲突处理经验,以及 merge 和 rebase 中的 ours 和 theirs 的差别。
merge 和 rebase 对于 ours 和 theirs 的定义是完全相反的。在 merge 时,ours 指代的是当前分支,theirs 代表需要被合并的分支。而在 rebase 过程中,ours 指向了修改参考分支,theirs 却是当前分支。因为 rebase 隐含了一个git checkout upstream的过程,将HEAD从 local 分支变成了 upstream 分支。git 会在 rebase 结束后撤销这个改变,但它已经不可避免地影响了冲突的状态,使 rebase 中 ours 和 theirs 的定义与 merge 截然相反。因此,在使用 ours 与 theirs 时请格外小心。
(1). clone
git clone <版本库的网址> git clone <版本库的网址> <本地目录名>
克隆jQuery的版本库
git clone https://github.com/jquery/jquery.git
git clone -o jQuery https://github.com/jquery/jquery.git
(2). remote
列出所有远程主机
git remote
使用-v选项,可以参看远程主机的网址
git remote -v
可以查看该主机的详细信息
git remote show <主机名>
添加远程主机
git remote add <主机名> <网址>
删除远程主机
git remote rm <主机名>
修改远程主机名称
git remote rename <原主机名> <新主机名>
(3). fetch
取回所有分支(branch)的更新到本地
git fetch <远程主机名>
取回某的特定分支的更新
git fetch <远程主机名> <分支名>
取回origin主机的master分支的更新
git fetch origin master
所取回的更新,在本地主机上要用”远程主机名/分支名”的形式读取。比如origin主机的master,就要用origin/master读取。可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支
git merge origin/master
git rebase origin/master
(4). pull
git pull <远程主机名> <远程分支名>:<本地分支名>
取回origin主机的next分支,与本地的master分支合并
git pull origin next:master
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull origin next
上面的命令实质上等同于先做git fetch,再做git merge。
git fetch origin
git merge origin/next
合并需要采用rebase模式
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
(5). push
git push <远程主机名> <本地分支名>:<远程分支名>
注意:分支推送顺序的写法是”<来源地>:<目的地>”,所以 git pull 是”<远程分支>:<本地分支>”,而 git push 是”<本地分支>:<远程分支>”。
如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建
git push origin master
省略了本地分支,以下等同,删除origin主机的master分支
git push origin :master
git push origin --delete master
如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略
git push origin
如果当前分支只有一个追踪分支,那么主机名都可以省略。
git push
如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push
git push -u origin master
不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机
git push --all origin
强制推送
git push --force origin
git push不会推送标签(tag),除非使用–tags选项
git push origin --tags
就像代码需要代码规范一样,代码管理同样需要一个清晰的流程和规范。三种广泛使用的工作流程:
Git flow
Github flow
Gitlab flow
三种工作流程,有一个共同点:都采用”功能驱动式开发”(Feature-driven development,简称 FDD)。它指的是,需求是开发的起点,先有需求再有功能分支(feature branch)或者补丁分支(hotfix branch)。完成开发后,该分支就合并到主分支,然后被删除。最早诞生、并得到广泛采用的一种工作流程,就是Git flow。
它最主要的特点有两个。首先,项目存在两个长期分支,分别是:主分支 master、开发分支 develop。其次,项目存在三种短期分支,分别是:功能分支(feature branch)、补丁分支(hotfix branch)、预发分支(release branch),一旦完成开发,它们就会被合并进 develop 或 master,然后被删除。