快速入门-Git和常用命令收集

237 阅读10分钟

Git 是一个分布式版本控制系统,用于跟踪代码和项目文件的更改。它可以帮助开发者管理项目的不同版本、协作开发,并且能够记录每次修改的详细历史记录。

Git 常与 GitHub、GitLab、Gitee 等代码托管平台配合使用,用于代码共享和协作开发。

Git 与 GitHub、GitLab、Gitee 他们之间的关系怎么理解?

它们之间的关系就像 Git 是核心技术,而 GitHub 和 Gitee 是不同的在线服务提供商,基于相同的技术来提供托管服务。

Git 作者

Git 的作者就是大名鼎鼎的 Linus Torvalds,Liunx 的作者。事情是这样的,Torvalds 在开发 Liunx 的时候,一开始使用的是第三方的版本控制软件 BitKeeper。然而,由于 BitKeeper 的许可证问题,Torvalds 被迫寻找一种新的版本控制系统,为了不受制于人,Torvalds 仅仅用了一周的时间就手撸了 Git 的核心代码。由于其简单易用,快速高效的特点,Git 很快就受到了广泛的欢迎和应用。
更多想了解的 Git 的历史和版本发布情况可以关注他的官网和源码库

git-scm.com/

github.com/git/git

在 Git 出现之前,开发者通常使用集中式版本控制系统(如 CVS 和 SVN)来管理项目。然而,这些系统存在几个主要问题:

  • 中心化依赖:集中式版本控制系统依赖于单一的中央服务器,如果服务器宕机或网络不通,开发者将无法进行提交或更新操作。

  • 协作效率低:开发者在协作时需要频繁与中央服务器进行交互,导致效率低下,特别是在处理大规模项目时。

  • 合并和分支操作复杂:早期的版本控制系统在处理分支和合并操作时存在较大困难,尤其是多个开发者并行工作时。

Git 的作用和解决的问题

  • 分布式版本控制:Git 允许每个开发者拥有项目的完整副本(包括完整的版本历史),即使没有中央服务器,开发者也可以在本地进行提交、查看历史等操作。解决了集中式系统对中央服务器的依赖问题,增强了开发的灵活性和效率。

  • 高效的分支和合并:Git 使用轻量级的分支机制,开发者可以快速创建分支来进行功能开发、修复 Bug 等工作。分支和合并操作非常高效,能够处理多个开发者同时工作产生的代码冲突。解决了传统版本控制系统中,分支和合并复杂性的问题。

  • 强大的历史记录和变更追踪:Git 能够详细记录项目的每次变更,包括修改的内容、时间、作者等信息,便于追溯历史。解决了团队开发中对变更管理的需求,帮助开发者了解每次修改的细节。

  • 支持离线工作:开发者可以在本地仓库中进行提交等操作,而不需要与远程服务器进行交互,这意味着即使没有网络连接也能继续工作。解决了网络环境不稳定或者远程服务器故障带来的问题。

  • 高效的协作:Git 的分布式特性使得团队成员之间可以并行开发,通过合并功能确保最终代码的整合。解决了多人协作开发中的冲突问题,并提高了工作效率。

快速实践

1. 安装 Git

首先,你需要安装 Git。如果你还没安装,可以从 Git 官网下载并安装 Git。

在安装完成后,通过命令行验证 Git 是否安装成功:

git --version

2. 设置用户名和邮箱

Git 会使用用户名和邮箱来标记提交的作者信息。

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

3. 创建一个新的 Git 仓库

创建一个新项目的目录,并在其中初始化 Git 仓库,git init 会在当前目录中创建一个空的 Git 仓库。

# 创建目录
mkdir my-project
cd my-project

# 初始化
git init

# 该方法是已经存在远程库,直接从远程库上clone下来
git clone 远程库地址

4. 添加文件并进行初次提交

echo "# My First Git Project" > README.md
git add README.md

# 提交
git commit -m "Initial commit"

5. 推送到远程仓库(可选)

git remote add origin https://github.com/yourusername/my-project.git
git push -u origin main

Git 配置


# 配置git的用户名和邮箱 
git config [user.name](http://user.name/) "user1"
git config user.email "[user1@163.com](mailto:user1@163.com)"

# 全局配置
git config --global user.name xxx
git config --global user.email xxx

# 换行符号的自动设置(是否打开)
Git config --global core.autocrlf false

# 关闭证书校验
git config --system http.sslverify false

# 更新git配置文件中证书存放位置信息:
git config --system http.sslcainfo "D:/ProgramFiles/Git/mingw64/ssl/certs/ca-bundle.crt"

常用命令收集

# 创建一个 git 仓库 
git init
git init --bare .git

# 查看状态
git status

# 添加记录
git add file.txt
git add *.txt     提交所有文件

# 提交
git commit - m "msg"

# 从运程库克隆到本地
git clone username@domain:path
# 比如github的版本库一般是git@github.com:用户名/版本库名

# 从远端版本库更新到本地
git pull

# 从本地上传到远端版本库
git push

# 撤消跟踪
git reset head file.txt

# 修改提交
git commit -a -m "msg"

# 添加到上一次add中
git commit --amend

# 撤销 git 的上一个 commit
git reset --soft HEAD^

 --soft  不删除工作空间改动代码,撤销commit,不撤销 git add.
 --hard  删除工作空间改动代码,撤销commit,撤销 git add.
 注意完成这个操作后,就恢复到了上一次的commit状态。

# 创建分支
git checkout -b 分支名称

# 提交并创建分支
git push -u origin 分支名称

# 分支合并
git checkout week        切换到week分支
git commint -a -m "msg"  提交修改           
git checkout master      切换到master分支
git merge week           将week合并到master        
 
# 删除分支
git checkout master      切换到master分支
git branch -d 分支名称     删除
git push origin --delete 分支名称    同步到远程版本库

###################################################

# 进行栈存
git stash

 当您想记录工作目录和索引的当前状态,但又想返回一个干净的工作目录时,请使用git stash。
 该命令将保存本地修改,并恢复工作目录以匹配头部提交。
 stash 命令能够将还未 commit 的代码存起来,让你的工作目录变得干净。

# 保存当前未commit的代码  
git stash  
  
# 保存当前未commit的代码并添加备注  
git stash save "备注的内容"  
  
# 列出stash的所有记录  
git stash list  
  
# 删除stash的所有记录  
git stash clear  
  
# 应用最近一次的stash  
git stash apply  
  
# 应用最近一次的stash,随后删除该记录  
git stash pop  
  
# 删除最近的一次stash  
git stash drop  

###################################################

git cherry-pick 

 对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。
 这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。
 另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 cherry pick。

git cherry-pick <commitHash>

 上面命令就会将指定的提交commitHash,应用于当前分支。
 这会在当前分支产生一个新的提交,当然它们的哈希值会不一样。
 举例来说,代码仓库有master和feature两个分支。

   # a - b - c - d   Master
   #      \
   #        e - f - g Feature
   
 现在将提交f应用到master分支
 切换到 master 分支$ git checkout master
 cherry pick 操作 git cherry-pick f

 上面的操作完成以后,代码库就变成了下面的样子

   # a - b - c - d - f   Master
   #      \
   #        e - f - g Feature

 从上面可以看到,master分支的末尾增加了一个提交f。
 git cherry-pick命令的参数,不一定是提交的哈希值,分支名也是可以的,表示转移该分支的最新提交。

git cherry-pick A..B 

 上面的命令可以转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。
 注意,使用上面的命令,提交 A 将不会包含在 Cherry pick 中。如果要包含提交 A,可以使用下面的语法。

git cherry-pick A^..B 

 git cherry-pick命令的常用配置项如下。
   #(1)-e,--edit         打开外部编辑器,编辑提交信息。
   #(2)-n,--no-commit    只更新工作区和暂存区,不产生新的提交。
   #(3)-x                 在提交信息的末尾追加一行(cherry picked from commit ...),方便以后查到这个提交是如何产生的。
   #(4)-s,--signoff      在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。
   #(5)-m parent-number,--mainline parent-number    如果原始提交是一个合并节点,来自于两个分支的合并,那么 Cherry pick 默认将失败,因为它不知道应该采用哪个分支的代码变动。-m配置项告诉 Git,应该采用哪个分支的变动。它的参数parent-number是一个从1开始的整数,代表原始提交的父分支编号。

# 代码冲突: 如果操作过程中发生代码冲突,cherry pick 会停下来,让用户决定如何继续操作。

#(1)--continue
git cherry-pick --continue

 用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 Cherry pick 过程继续执行。


#(2)--abort

 发生代码冲突后,放弃合并,回到操作前的样子。

#(3)--quit

 发生代码冲突后,退出 cherry pick,但是不回到操作前的样子。

 总结

工具类型优点缺点典型使用场景
Git分布式 VCS- 分布式架构,支持离线操作- 快速且轻量化的分支管理- 良好的社区支持和扩展性- 高效存储与检索- 对新手学习曲线较陡峭- 合并冲突时复杂项目的管理较为繁琐- 开源项目- 大规模分布式团队开发
Subversion (SVN)集中式 VCS- 简单易用,学习曲线平缓- 中央服务器可控制代码访问- 高效处理大文件- 依赖中央服务器,离线操作有限- 分支管理较重,操作较慢- 小型团队项目- 非分布式环境
Mercurial分布式 VCS- 学习曲线平缓- 分布式架构,与 Git 类似- 处理大项目性能较好- 社区活跃度较 Git 低- 一些高级功能相比 Git 较弱- 开源项目- 分布式开发环境
Perforce集中式/分布式混合 VCS- 强大、快速,适合处理超大规模项目- 优秀的大文件和二进制文件管理- 分布式和集中式混合模式- 配置复杂,非开源- 商业授权费用较高- 游戏开发- 大型企业软件开发

Git 在市场中占据主导地位,适合大多数项目,特别是开源项目和大型团队开发。SVN 仍然在许多企业中使用,适合简单需求的集中式版本控制。Mercurial 类似 Git,但简化了操作,适合需要分布式且希望降低复杂度的项目。Perforce 和 Plastic SCM 则专注于企业级项目,尤其是对大文件和二进制文件的处理,广泛应用于游戏开发等行业。

 致谢

更多内容欢迎关注 [ 小巫编程室 ] 公众号,喜欢文章的话,也希望能给小编点个赞或者转发,你们的喜欢与支持是小编最大的鼓励,小巫编程室感谢您的关注与支持。好好学习,天天向上(good good study day day up)。

参考资料

[1]官网: git-scm.com/

[2]源码库: github.com/git/git

[3]Github 官网: github.com

[4]Gitee 官网: gitee.com