SGwanmin

在学习C语言和数据结构,,, 日了,上学时候没感觉啥的,学的越多发现得调头翻大学教材了,啊,西八!

导航

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 即可!记录好相关改动信息即可~

 

posted on 2024-07-17 10:34  GwanMin  阅读(212)  评论(0)    收藏  举报