Windows下的Git
windows-Git-致敬Linus
一、Git简介
集中式VS分布式:
先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,会被外部网速因素影响太大了。
而分布式版本控制系统根本没有”中央服务器“,每个人的电脑上都是一个完整的版本库,工作的时候不需要联网,只需要把改动互相推送给对方即可,相比集中式版本控制系统的安全性要高很多,因为每个人的电脑都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

分布式版本控制系统中 通常需要有一台机器充当”中央服务器“,用来方便交换大家的修改。
Git的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理,把SVN等远远抛在了后面。
安装Git
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
注意:git config命令的--global参数,是全局配置
创建本地版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
$ mkdir learngit $ cd learngit $ pwd /Users/michael/learngitppwd
pwd命令用于显示当前目录。该仓库位于 /Users/michael/learngit
注意:如果是windows系统,请确保path不包含中文(可能会出现一些奇奇怪怪的问题)
第二步,通过Git init命令 将这个目录变成Git可以管理的仓库:
$ git init Initialized empty Git repository in /Users/michael/learngit/.git/
在当前目录下会生成一个.git的目录,这个目录是用来跟踪管理版本库的,没事 别动!(如果没有就是被隐藏了)
注意:所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
这里提示一点,不要用windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题。推荐使用VS Code。
远程库
上文提到找一台电脑充当服务器的角色,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。但还有一个GitHub的网站从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。(我平时使用的涉及到 公司方面的信息,就不放图了,以下都是用GitHub举例)
第一步:生成本地SSH Key:本地Git仓库和GitHub仓库之间的传输是通过SSH加密的
在user主目录中找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,前者是私钥,后者是公钥。如果没有则打开Git Bash,创建SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
一路回车。
第二步:配置SSH Key
登入GetHub,打开Account Settings/SSH Keys ,点击Add SSH Key 这里 Title(别乱填哈,这个后期遭罪啊)
key的内容从id_rsa_pub中复制

现在有了本地库,和远程库,现在需要将二者关联起来,使这两个仓库进行远程同步。
首先登入GitHub,在右上角找到“Create a new repo”按钮,创建一个新的仓库:

在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:

将其与本地仓库关联,在本地的仓库下运行命令:
$ git remote add origin git@github.com:SGwamin/learngit.git
Swanmin 替换成自己的GitHub账户名,然后使用git push命令将分支推送远程,因为远程库是空的,所以在第一次push 的时候加了-u参数,GIt不但会把本地的master分支推送到远程的新的master分支上,还会把本地的master分支和远程的master分支关联起来。
搭建Git服务器(我没搭建过,以下都来自互联网~~~)
需要一台Linux 机器和Sodu权限的账户,为啥是Linux,因为便宜!!!
第一步 安装git:
$ sudo apt-get install git
第二步 穿件一个git用户,用来运行git服务
$ sudo adduser git
第三步 创建证书登录:
收集所有需要登陆的user的公寓(id_rsa_pub)文件,然后导入/home/git/.ssh/authorized_keys文件,一行一个。
第四步 初始化Git仓库:
选定一个目录,然后在目录下输入命令
$ sudo git init --bare xxx.git
git会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库要求共享,所以不让用户直接登入到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾,
需要吧Owner 改为.git
$ sudo chown -R git:git xxxxx.git
第五步 禁用Shell登入:
可以通过编辑/etc/passwd文件完成,找到类似下面这行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,user可以通过ssh来使用git,但无法登入Shell(每次登入就会自动退出)
第六步 克隆远程仓库:
$ git clone git@server:/srv/xxx.git Cloning into 'sample'... warning: You appear to have cloned an empty repository.
管理公钥
如果团队比较小,可以把每个人的公钥收集到/home/git/.ssh/authorized_keys文件里就是可行的,
如果团队比较大用Gitosis~管理权限Gitolite
二、Git的使用
在介绍Git的使用前,先看一下Git的存储结构,可以分为四个地方:
1.Remote Repository
GitLab上的代码库,为所有人使用
2.Local Repository
在开发机器上从gitlab下载的代码库:Local Repository包含Remote Repository中完整的提交信息,就是在这里实现了即使Remote Repository 无法使用,依然可以开发的功能。
3.Stage
介于Local Repository和Working Directory之间,是代码的缓存区,存放文件变动信息。
4.Working Directory
开发下载代码的内容,正在编辑的代码
TortoiseGit安装
不会命令行~可恶啊,一直用的这个工具,封装了命令行。
小乌龟下载页面,安装过程中,在SSH Client配置页面,选择第二个OpenSSH,其他的使用默认配置即可。

安装完成后,会自动运行并启动配置,如果没能打开,可任意folder-右键-TortiseGit-Settings-General-Re-run First Start Wizard。

配置过程中,需要修改的页面如下:



以上就是需要配置的TortoiseGit的过程。
TortoiseGit 使用
Fetch-代码文件右键-TortoiseGit-Fetch:
可以将Remote Repository上的改动和最新的分支信息都同步到Local repository中
后面的就不啰嗦了都是 :代码文件右键-TortoiseGit

Switch/Checkout 切换working Directory:

在切换窗口,可以看到列表中有两个master,一个是master,另一个是remotes/orgin/master.
前者是Loacl repository的,后者是remote repository ,选定后者,会默认创建同名的loacl repository。
Commit Change:

在下方提交按钮处,有三个选项:
1.commit 把改动只提交到Local Repository
2.ReCommit 再次改动只提交到Local Repository
3.Commit&Push 把改动提交到Local Repository,并推送到Remote Repository
Message需填写清楚即可~

在提交处,可以将总不需要更改的文件加入到 ignore 中,比如配置文件。
Rebase:
在日常开发中,一个分支很可能是多个开发在同时进行修改;这就引入了Rebase的概念,来更新分支上其他人的改动,操作步骤如下:
在fetch页面,勾选Lanuch Rebase After Fetch,如图:

在打开的rebase窗口,如果Working Directory与他人的提交没有冲突,则在Start处会提示FastFwd,可以快速完成megre代码的操作。

如果有冲突时,会列出在Local Repository上已提交的记录,且下方显示Start Rebase(无FastFwd)。
点击Start Rebase开始merge,并处理merge 过程中的冲突文件,之后点击Commit,把merge的改动提交到Local Repository上;
在处理所有的冲突后并merge完各个提交后,最后点击Done就完成了代码的merge。

在Rebase时,可能会提示是否Stash,点击Yes Stash即可(移除);在Rebase完成后,会同样提示是否Pop Stash(还原),点击Yes。
Stash是把当前Work Directory的不想commit的改动缓存一下,并把这些改动从分支中移除(类似Revert),从而方便分支进行Rebase,减少冲突。
Rebase master同理,两个注意事项
最好在所有code都提交之后,在进行本操作,避免出现问题。
同一分支,请指定人员进行本操作,避免多人同时进行rebase master,导致代码冲突较多。
Push:
将Loacl Repository代码改动提交到Remote Repository
Know Change 勾选后会覆盖远程分支。
如果是往Master(主分支),必须点,分 分之,不勾选!
ps:文件丢失或者被覆盖 可以考虑使用patch
Create patch Serial

since:选择分支
Number Commits:限制将创建多少patch
Range:From-to 提交记录
下载完成后 Apply patch Serial

Apply 之
当code改动提交完成后,提交merge Request 即可!记录好相关改动信息即可~
浙公网安备 33010602011771号