目录
前言
在软件开发中,版本控制(Version Control)是管理代码变更的重要工具。除了 Git 外,还有许多其他版本控制系统(VCS)。它们可以分为集中式(Centralized)和分布式(Distributed)版本控制系统。
1. 集中式版本控制系统(Centralized Version Control Systems)
集中式版本控制系统有一个中央服务器,所有的代码版本信息都存储在这个中央存储库中。用户必须通过网络连接到该服务器来获取最新代码或提交更改。
常见的集中式版本控制系统:
- Subversion (SVN):
- 由 Apache Software Foundation 开发,广泛应用于开源和商业项目。
- 使用简单的命令行和图形界面工具支持。
- CVS (Concurrent Versions System):
- 早期的版本控制系统,曾被广泛采用,但现在逐渐被淘汰。
- 支持多个开发者并行开发的版本管理。
- Perforce:
- 一个企业级版本控制工具,提供高性能和强大的功能,适合大型项目。
- 支持大型二进制文件和文件夹的管理。
2. 分布式版本控制系统(Distributed Version Control Systems)
分布式版本控制系统允许开发者在本地创建完整的代码仓库,所有历史版本信息都存储在本地,甚至可以在没有网络的条件下工作。
常见的分布式版本控制系统:
- Git:
- 最流行的分布式版本控制系统,设计用于高效的协作开发。
- 支持轻量级分支和合并操作。
- Mercurial:
- 另一个分布式版本控制系统,使用简单,适合各种规模的项目。
- 提供图形界面和命令行工具。
- Bazaar (bzr):
- Canonical 开发的一个版本控制系统,其设计目标是简单易用。
- 支持分布式和集中式工作流程。
两者的区别:
1、介绍
以下重点介绍下关于Git的操作。
Git 是一个分布式版本控制系统,广泛用于管理软件开发中的源代码。通常可以使用 Git 来跟踪代码的变化、协作开发和管理项目版本。github和Git是两个东西,github是一个社区,git是一个服务系统,github只支持git分布式系统,所以故名成为github。
1.1.基本概念
- 版本控制:Git 允许您跟踪对文件的历史修改,您可以查看谁在什么时候做了什么更改。
- 分布式:Git 的设计让每个开发者的机器上都有一个完整的代码仓库,包括所有版本历史。这使得开发者可以在本地进行更改并在需要时将它们推送到共享仓库。
- 分支管理:Git 的分支功能使得开发者可以同时在不同的功能上进行工作,而不会影响主分支(如
main
或master
)。分支非常轻量,创建和删除都很方便。
1.2.流程
以下是git的流程图:
1.3.作用
它不仅能提高开发效率,还能促进团队协作和代码管理。
1.4.工作区与缓存区
在git下有一个概念是缓存区,这是其它集中式版本控制系统没有的
工作区:工作区就是你当前的工作目录
缓存区:这里存放了你使用git add命令提交的文件描述信息,它位于.git目录下的index文件中,有的低版本中叫stage.
- Workspace:开发者工作区
- Index / Stage:暂存区/缓存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
2、安装与配置
-
安装 Git:根据您的操作系统,下载并安装 Git。
- Windows: Git for Windows
- macOS: 使用 Homebrew 安装
brew install git
- Linux: 使用包管理工具(如
apt
或yum
)安装。
- 配置 Git:
安装完成后,您可以使用以下命令进行基本配置:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
3、Git 常用命令
以下是常见的 Git 命令及其作用:
1.初始化仓库:
git init
在当前目录中初始化一个新的 Git 仓库。
2.克隆仓库:
git clone <repository-url>
克隆一个远程仓库到本地。
3.查看状态:
git status
查看当前仓库的状态,包括变更的文件。
4.添加文件:
git add <file-name>
将文件添加到暂存区。
5.提交更改:
git commit -m "Commit message"
如果想要重写commit里面的内容,使用git commit --amend命令。
1、修改提交信息:
如果您只是希望更改最近提交的提交信息,可以使用:
git commit --amend -m "新的提交信息"
2、添加更改:
如果您希望在最近的提交中添加一些未包括的新更改,您需要先将这些更改添加到暂存区,然后使用 amend:
git add <file1> <file2> # 添加更改的文件到暂存区
git commit --amend
它允许您修改最后一次提交(commit)所涉及的内容或提交信息。使用该命令,您可以轻松地对最近的提交进行更改,而不必重新创建新的提交。
注意事项
-
历史重写:
使用git commit --amend
会改变提交历史。因此,如果这个提交已经推送到了远程仓库,执行 amend 会导致远程仓库中的历史和您的本地历史不一致。这在协作环境中可能会导致问题,您需要用推送的--force
或--force-with-lease
,但要小心这样做,因为它会重写远程历史。 -
只能修改最近的提交:
--amend
只能用于修改最近的一次提交。如果您想要修改历史更早的提交,通常需要使用git rebase
或git cherry-pick
的操作。 -
工作区未清理:
使用git commit --amend
前,请确保您的工作区是干净的。如果还有未添加的更改,amend
会将这些文件和当前暂存区一起合并到上一个提交中。
6.推送更改:
git push origin <branch-name>
将本地的提交推送到远程仓库。
1、如果想要回滚:git reset --hard
git reset --hard 要回滚id
reset参数是重置命令,--hard是重置代码仓库版本,回滚id可以根据git log看到。
有三种模式
--soft 、--mixed以及--hard是三个恢复等级。
使用--soft就仅仅将头指针恢复,已经add的暂存区以及工作空间的所有东西都不变。
如果使用--mixed,就将头恢复掉,已经add的暂存区也会丢失掉,工作空间的代码什么的是不变的。
如果使用--hard,那么一切就全都恢复了,头变,aad的暂存区消失,代码什么的也恢复到以前状态。
7.拉取更改:
git pull
从远程仓库拉取并合并更改。
8.创建分支:
git branch <branch-name>
9.切换分支:
git checkout <branch-name>
切换到指定的分支。
10.合并分支:
git merge <branch-name>
将指定的分支合并到当前分支。
11.查看提交历史:
git log
4、Git创建仓库
1.创建 Java 项目:
首先,在您的本地机器上创建一个新的 Java 项目(例如,使用 Maven 或 Gradle)。
2.初始化 Git 仓库:
cd your-java-project
git init
3.添加文件并提交:
git add .
git commit -m "Initial commit"
4.创建远程仓库:您可以在 GitHub、GitLab 或 Bitbucket 等平台上创建一个远程仓库。
将远程仓库关联到本地仓库:
git remote add origin <repository-url>
5.推送首次提交:
git push -u origin main
6.日常开发:
在开发过程中,可能存在频繁使用 git add
和 git commit
来持续保存您的更改,如果您需要进行新功能开发,可以创建新分支,确保主分支保持稳定,并且每次开发前,可以git pull,拉取最新的代码。
5、常见场景
1、将文件撤销回到最近一次修改的状态:git checkout -- file(修改文件的名称)
当我们在工作中修改了一个文件,猛然间发现内容好像改的不对,想重新修改,这个时又不知道自己改了什么代码,想撤销修改,有一个最简单的方法,就是git checkout -- file,注意中间要有“--”,checkout这个命令是切换分支的功能,关于它我们后面在细说,你现在只需要知道这个命令加上“--”可以用来将文件切换到最近一次的状态
注意这个恢复只能恢复到上一次提交的状态,如你刚提交了这个文件到仓库,随后你修改了它,那么使用这个命令只会回到刚刚提交后的那个状态里,不能回到你还没有提交,但修改的状态中。
2、git删除本地分支:git branch -D
git branch -D 分支名
3.git删除远程分支:git push origin --delete
注意这里的远程分支名不需要加origin,输入分支名就可以了
git push origin --delete 远程分支名
4、git将远程仓库关联到本地和拉取指定分支、切换远程分支
使用git clone -b分支名 仓库地址来指定分支
5、git子模块管理:git submodule
在当我们项目较大的情况下,都会使用模块化编程,把不同的业务功能分割成数个子模块,git也拥有对子模块进行管理的方法,submodule,可以使用它来添加子模块与管理子模块。
如添加一个子模块:
git submodule add http://*******/scm/wlibold/weye_lib.git
使用如上命令会添加一个子模块,名为weye_lib的子模块到自己的仓库中,这样我们就可以使用了
在添加时会添加仓库的最新版本,但是此模块不会自动更新,需要我们手动更新,当子模块的仓库进行了更新,我们需要进到此子模块的文件夹中执行如下命令:
git submodule update
若我们想要使用指定版本的子模块也可以使用切换版本命令来完成子模块的版本切换,同时你也可以使用git log命令查看这个子模块的版本提交。
注意根据git版本不同的原因,你在添加时可能下来的子模块是空项目,这个时候可以使用如下命令:
首先进入到克隆下来的子模块目录,并执行如下命令:
git submodule init
git submodule update
最新的git在使用add添加子模块时会自动使用这两个命令。
这两个命令作用分别是初始化子模块仓库,更新远程子模块仓库到本地,最早的git添加子模块只是先在本地生成了映射关系,需要手动执行这两个命令。
最后别忘记使用git add与git commit提交一次。
6、git查看不同分支的文件差异:git diff
git diff master dev test.txt
7.git查看仓库信息:git remote
使用git remote可以查看当前仓库名称
使用git remote -v可以看到更详细的权限信息。
8.git修改分支名称:git branch
使用-m选项
git branch -m 分支名 新的分支名
9.git保存当前工作切换分支:git stash
在你当前工作区修改了文件或者其它功能时,你想要切换或者创建到其它分区是不可能的
我们可以使用git stash命令来保存当前工作状态
保存工作状态之后可以使用git stash list查看当前存储了多少工作状态
git stash list
当在别的分支做完事情之后,在切换回刚刚的分支,然后在刚刚的分支中将状态恢复
恢复暂存的更改
git stash apply
恢复并移除暂存的更改
git stash pop
清空所有的暂存项,可以使用:
git stash clear
仅暂存部分更改:
如果您希望只暂存某些文件的更改,可以使用:
git stash push <file>
添加消息:
您可以在暂存时添加描述信息,以便更好地管理和理解这些更改:
git stash push -m "描述信息"
注意stash是以栈的方式保存的,先进后出。
准确来说,这个命令的作用就是为了解决git不提交代码不能切换分支的问题。
10.将别的分支修改转移到自己的分支:git cherry-pick
总结
Git 是现代软件开发中不可或缺的工具,它提供了强大的功能和灵活性,使得个人和团队能够有效地管理项目代码和协作。通过不断学习和实践 Git,能够提高工作效率,减少错误,并更好地参与到团队开发中。
参考文章: