Git教程

本文深入讲解Git的安装、配置、版本库管理、远程仓库同步、分支管理等核心技能,涵盖日常开发所需的所有Git操作,适合初学者和进阶者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


title: Git教程
date: 2019-01-07 21:20:37
tags:

Git教程


Git是目前世界上最先进的分布式版本控制系统(没有之一)。
现在的项目开发已经离不开Git了,其强大的分支管理令多人协同开发十分便捷。
并且先在很多项目都选择在github上开源,学Git已是大势所趋。

一、安装和创建版本库

安装

在Ubuntu上安装git,先在终端输入git,看看系统有没有安装git

$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git

如上面提示是没有安装git,通过一条sudo apt-get install git命令即可完成git安装。
安装完成后,需要进行下一步的设置;

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

git config 命令用了-global参数,表示你这台机器上的所有git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址

创建版本库

版本库又名repository。
在一个目录下,通过git init命令把这个目录变成Git可以管理的仓库,目录下多了一个隐藏的.git文件夹,它是用来跟踪管理版本库的。
将文件添加到仓库需要两步:

$ git add <file>  //把file文件添加到仓库。使用git add .可以把目录下全部改动的文件添加
$ git commit -m <message> //把文件提交到仓库。-m后面输入的是提交的说明,最好添加上说明,不然会提示错误

二、远程仓库

远程仓库

Github网站提供Git仓库托管服务,只要注册一个Git帐号,就可以免费获得Git远程仓库。
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要设置:
第一步:创建SSH Key。打开终端,创建SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"

一路回车,默认值即可。
之后可以在用户主目录中找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第二步:打开github网址,打开“Account setting”,“SSH and GPG keys"页面,然后点New SSH key,填写任意title,在key值栏里粘贴id_rsa.pub文件的内容。
Github需要SSH key是因为github需要识别推送内容是尼推送的,而不是别人冒充推送的,而且Git支持SSH协议,所以Github只要知道了你的公钥,就可以确认只有你可以推送。
而且,Github允许你添加多个Key,你就可以在多台电脑上往Github
上推送了。

添加远程库

在本地创建一个Git仓库后,在Github创建一个Git仓库,并且让着两个仓库进行远程同步,这样。Github上的仓库既可以作为备份,又可以让其他人通过该仓库来协作

git remote add origin git@github.com:sherrybabyone/demo.git   // 关联一个远程仓库
git push -u origin master    // 关联后,第一次推送master分支的所有内容
git push origin master   // 此后,可以省略-u参数

从远程库克隆

git clone git@github.com:sherrybabyone/demo.git   // 克隆远程仓库

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快

三、时光机穿梭

先说明两个命令:

$ git status   //掌握工作区的状态
$ git diff <file>  //如果git status显示有文件被修改过,用git diff 可以查看被修改的内容。可以查看工作区和版本库里面最新版本的区别。

版本回退

$ git log    // 命令显示在版本库的提交日志。

在Git中,每次commit提交到仓库都会保存一个快照,称为commit,操作失误时可以回退之前的commit恢复。
一大串类似6899rta…的是commit id(版本号)

// 在Git中,用HEAD表示当前版本,上一个版本是HEAD^,上上一个版本号是HEAD ^^,往上100个版本用HEAD~100表示。
$ git reset --hard commit_id     //回退到指定版本
$ git reset --hard HEAD^     //回退到上一个版本
$ git reflog    //命令查看历史所有提交命令,以便确定返回哪个版本的版本号

工作区和暂存区

工作区:你存储git及文件的文件夹就是一个工作区。
版本库:工作区里的隐藏目录.git就是GIt的版本库
Git的版本库里包含很多东西,有被称为stage的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master分支的HEAD指针等等。
git add 把文件添加进去,实际上就是把文件添加到暂存区里。
git commit提交,实际上就是把暂存区里的所有文件提交到当前分支

管理修改

Git追踪并管理的是修改,而非文件。
每次修改,如果不用git add到暂存区,那就不会加入到commit中。

撤销修改

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,把暂存区的修改撤销掉(unstage),就回到了场景1,第二步按场景1操作。HEAD表示最新的版本

删除文件

从版本库中删除文件:

$ git rm <file>  // 删除一个文件
$ git commit -m " "  // 提交到版本库中

四、分支管理

创建和合并分支

在Git里,master称为主分支,HEAD指向是当前分支。

$ git branch   // 查看分支,当前分支前会有一个*号
$ git branch <name>   // 创建一个指定分支
$ git checkout <name>   // 切换到指定分支
$ git checkout -b <name>   // 创建并切换到指定分支
$ git merge <name>   // 合并某分支到当前分支。Fast-forward指的合并模式是”快进模式“,直接把当前分支指向指定分支的提交
$ git branch -d <name>   // 删除指定分支

解决冲突

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

分支管理策略

通常,合并分支时,如果可能,Git会用Fast forwward模式,但在这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

$ git merge --no-ff -m "merge with no-ff" dev   // --no-ff参数,表示禁用Fast forward。因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去

如果要丢弃一个没有合并的分支,使用git branch -d <name>会报错

$ git branch -D <name>    // 强行删除

Bug分支

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,可以先把工作现场git stash暂存起来

$ git stash    // 会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。
$ git stash pop    // 恢复之前缓存的工作目录
$ git stash list    // 查看保存的stash

多人协作

当从远程库克隆时,实际上Git会自动把本地的master分支和远程的master分支对应起来了,并且,远程库的默认名称是origin

git remote    // 查看远程库的信息
git remote -v   // 查看远程库的详细信息
git push origin master    // 推送分支。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上。
git pull    // 从远程抓取分支,如果有冲突,要先处理冲突
git branch --set-upstream-to=origin/dev dev    // 指定设置本地dev分支与远程origin/dev分支的链接

多人协作的工作模式通常是这样的:

  1. 首先,试图用git push origin <branch-name>推送自己的修改
  2. 如果推送失败,则因为远程分支有更新,需要先用git pull试图合并
  3. 如果合并有冲突,则解决冲突,并在本地提交
  4. 没有冲突或者解决冲突后,再用git push origin <branch-name>推送就能成功!
    如果giut pull显示no tracking information,则说明本地分支与远程分支的链接关系没有创建,需要用命令创建联系

Rebase

$ git log --graph --pretty=oneline --abbrev-commit   // 查看提交历史
$ git rebase    // 把本地未push的分叉提交历史整理成直线

标签管理

Git的标签是版本库的一个快照。虽然是版本库的一个快照,但其实它就是指向某个commit的指针(跟分支很像,但是分支可以移动,标签不能移动),创建和删除标签都是瞬间完成的。

创建标签

$ git tag <tagname>    // 用于新建一个标签,默认为HEAD,也可以指定一个commit id
$ git tag -a <tagname> -m "..."    // 可以指定标签信息
$ git tag    // 可以查看所有标签

操作标签

git push origin <tagname>    // 可以推送一个本地标签
git push origin --tags    // 可以推送全部未推送过的本地标签
git tag -d <tagname>    // 可以删除一个本地标签
git push origin :refs/tags/<tagname>   // 可以删除一个远程标签

使用Github

  • Github是一个开源协作社区,通过Github,既可以让别人参与你的开源项目,也可以参与别人的开源项目。
  • 在Github上,可以任意Fork开源仓库,参与一个开源项目
  • 自己拥有Fork仓库的读写权限
  • 可以推送pull request给官方仓库来贡献代码
内容概要:本文档主要展示了C语言中关于字符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)字符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定字符串中分离出奇偶位置字符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维字符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解字符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对字符串并去除其中的空白字符;②学会编写能够正确处理奇偶索引字符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维字符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编写类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值