# 《Git 操作使用教程》
一、Git 简介
Git 是一个分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。它让开发者可以轻松地跟踪代码的更改、与团队成员协作,并管理项目的不同版本。
二、安装 Git
- 在 Windows 系统上,可以从 Git 官方网站下载安装程序进行安装。
- 在 Linux 系统上,可以使用包管理器(如 Ubuntu 上的 `apt-get` )来安装 Git。
- 在 macOS 上,可以通过 Homebrew 或者从 Git 官方网站下载安装。
下载地址:Git - Downloads (git-scm.com)
三、 Git 中一些常见的概念
- 1. 工作区(Working Directory)
这是您日常进行项目开发和编辑文件的地方,就是您电脑上能看到和操作的本地目录。例如,您正在编写的代码文件所在的文件夹就是工作区。
- 2. 暂存区(Staging Area 或 Index)
当您对工作区中的文件进行修改后,可以将这些修改添加到暂存区。暂存区就像是一个临时的缓冲区,您可以选择将哪些修改纳入下一次的提交。比如说,您修改了多个文件,但只想先提交其中一部分的修改,就可以把要提交的部分放入暂存区。
- 3. 本地仓库(Local Repository)
这是在您本地计算机上存储项目完整版本历史的地方。每次提交都会在本地仓库中创建一个新的版本。比如,您在项目开发过程中多次进行提交,这些提交的记录都保存在本地仓库中。
- 4. 分支(Branch)
分支允许您在项目的不同版本或功能开发线上独立工作。常见的分支有主分支(通常是 master
或 main
)以及各种功能分支。例如,您可以创建一个名为 feature-x
的分支来开发新的功能,而不影响主分支的稳定。
- 5. 提交(Commit)
提交是将您在工作区中的修改进行保存并记录的操作。每次提交都包含了一个描述信息,说明这次修改的内容和目的。假设您完成了一个功能模块的一部分开发,并对相关代码进行了修改和测试,就可以将这些修改作为一次提交。
- 6. 远程仓库(Remote Repository)
通常位于代码托管平台(如 GitHub、GitLab 等)上,用于团队成员之间共享代码和协作。比如,团队中的其他成员可以从远程仓库获取您的提交和代码更改。
- 7. 合并(Merge)
当不同分支上的开发工作完成后,可以将它们合并到一起。例如,将 feature-x
分支上完成的功能合并到主分支。
- 8. 冲突(Conflict)
当在合并分支时,如果不同分支对同一文件的相同部分进行了不同的修改,就会产生冲突。这需要手动解决冲突,以确保合并的结果是正确的。比如,两个分支都修改了同一个函数的实现,就可能出现冲突。
这些是 Git 中一些基础且重要的概念,理解它们对于有效地使用 Git 进行版本控制和团队协作至关重要。
四、Git工作流程图
五、Git 的基本操作流程
-
1、初始化本地仓库
在您的项目目录中(示例目录:D:\dev\idea-workplace\test_git),鼠标右键--->open Git Bash here,打开Git命令行工具
使用 git init
命令将其初始化为一个 Git 本地仓库。
将会在当前目录生成一个.git的隐藏文件夹,存放当前项目本地仓库的配置信息,不要删除或修改。执行命令(ll -a)查看当前目录下的所有文件或文件夹(包括隐藏文件):
ll -a
进入.git文件夹查看
-
2、设置签名
本地仓库创建后需要先设置签名,主要作用是区分不同开发人员的身份。
在以上初始化本地仓库的目录“D:\dev\idea-workplace\test_git”下执行以下命令设置签名:
# 通过参数区分签名的生效范围# 1、仓库级别(或项目级别,不使用参数:--global):仅在当前本地库范围内有效git config user.name "Your Name"
git config user.email "your_email@example.com"# 2、系统用户级别(使用参数:--global):登录当前操作系统的用户范围均有效git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"级别优先级
1、就近原则:项目级别优先于系统用户级别,二者都有时优先采用项目级别的签名
2、如果只有系统用户级别的签名,就以系统用户级别的签名为准
3、二者都没有不允许
将 Your Name
替换为您的姓名,your_email@example.com
替换为您的邮箱。
示例1:系统用户级别签名
示例2:仓库(项目级别)签名
当设置系统用户级别签名时,会在系统当前登陆用户的home目录下生成一个.gitconfig的隐藏文件记录用户名和email。
cat命令查看信息
-
3、添加工作区文件到暂存区(git add)
使用 git add <文件名>
逐个添加文件,或者使用 git add.
添加当前目录下的所有修改和新增的文件。
########################创建文件并添加至暂存区##################
#在项目目录下新建Test.java文件
touch Test.java#方式1:将单个文件提交至Git暂存区
git add Test.java#方式2:将当前目录下的所有文件提交至Git暂存区
git add .########################修改文件并添加至暂存区##################
# 修改Test.java文件内容
#方式1:将单个文件提交至Git暂存区
git add Test.java#方式2:将当前目录下的所有文件提交至Git暂存区
git add .
示例
添加单个文件至Git暂存区
添加所有文件至Git暂存区
查看git状态
-
4、提交暂存区更改至本地仓库(git commit)
执行 git commit -m "提交描述信息"
,将暂存区的内容提交到本地仓库。描述信息应清晰地说明本次提交的更改内容。
例如:如果您新增了一个用户登录功能 ,可以写 "新增用户登录功能代码" 。
#提交暂存区至本地仓库
git commit -m '添加用户登录功能代码'#查看修改状态
git status#查看提交日志
git log
-
5、分支操作
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
-
5.1、查看本地分支
#查看本地分支
git branch
-
5.2、创建本地分支
若要进行新功能开发或进行不同的工作,可以使用 git branch <分支名>
创建分支,然后使用 git checkout <分支名>
切换到该分支。
比如:创建一个名为 develop
的分支来开发新的功能代码。
提示:新创建的分支会同步当前分支的全部内容。
比如:从master创建一个develop分支,那么新创建的develop分支包含master分支的最新内容。同理,切换到develop分支后修改了部分内容并提交后,再从develop分支创建一个dev1的分支,那么dev1分支中包含develop分支的最新内容。
#创建本地分支:git branch <分支名>
#创建一个名称为develop的分支
git branch develop
-
5.3. 在分支上工作
在分支上进行修改、添加或删除文件等操作,并提交至本地仓库。
-
5.4. 切换分支
使用 git checkout <分支名>
切换到其他分支。
#*切换分支(checkout)
#命令:git checkout 分支名
#切换到develop分支(分支已存在)
git checkout develop
-
5.5. 合并分支(必要时需要解决冲突问题)
当一个分支上的工作完成后,先切换到目标分支(通常是主分支),然后使用 git merge <要合并的分支名>
进行合并。
假设您在 develop
分支上完成了开发,切换到主分支后将其合并。
#合并分支,如想把develop分支的代码合并到master,则应先切换到master分支,再使用git merge develop命令进行合并#切换到master分支
git checkout master#合并develop分支到master分支
git merge develop
-
5.6、开发中分支使用原则与流程
-
master (生产) 分支
-
develop(开发)分支
-
feature/xxxx分支
-
hotfix/xxxx分支
-
5.7、分支操作练习
###########################创建并切换到deve01分支,在deve01分支提交文件
# [master]创建分支deve01
git branch deve01
# [master]切换到deve01
git checkout deve01
# [deve01]创建文件Test02.java
略
# [deve01]将修改加入暂存区并提交到仓库,提交记录内容为:add Test02 on dev
git add .
git commit -m 'add Test02 on dev'
# [deve01]以精简的方式显示提交记录
git log###########################切换到master分支,将deve01合并到master分支
# [deve01]切换到master分支
git checkout master
# [master]合并deve01到master分支
git merge deve01
# [master]以精简的方式显示提交记录
git log
# [master]查看文件变化(目录下也出现了Test02.java)
略##########################删除deve01分支
# [master]删除deve01分支
git branch -d deve01
# [master]查看本地分支
git branch
-
六、Git远程仓库
-
6.1、常用的托管服务[远程仓库]
- gitHub( 地址:https://github.com/ )是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名gitHub
- 码云(地址: https://gitee.com/ )是国内的一个代码托管平台,由于服务器在国内,所以相比于 GitHub,码云速度会更快
- GitLab (地址: https://about.gitlab.com/ )是一个用于仓库管理系统的开源项目,使用Git作 为代码管理工具,并在此基础上搭建起来的web服务,一般用于在企业、学校等内部网络搭建git私服。
-
6.2、创建远程仓库
略
-
6.3、配置SSH公钥
略
-
6.4、操作远程仓库
-
6.4.1、关联远程仓库
- 首先,确保您已经在本地创建了一个 Git 仓库。
- 使用以下命令来关联远程仓库:
git remote add <远程仓库名称> <远程仓库 URL>
例如,如果您要添加一个名为origin
的远程仓库,其 URL 为https://github.com/username/repository.git
,则命令为:git remote add origin https://github.com/username/repository.git
# 添加远程仓库命令:git remote add <仓库名称> <仓库路径>#SSH模式:邮箱:url
git remote add test xxxx@qq.com:https://gitee.com/xxx/test.git# Https模式
git remote add test https://gitee.com/xxx/test.git
在关联远程仓库后,您就可以执行诸如推送(git push
)和拉取(git pull
)等操作,与远程仓库进行交互。
-
6.4.2、查看远程仓库
看已配置的远程仓库名称,使用 git remote
命令。
#本地仓库与远程仓库建立连接后,使用命令查看远程仓库:git remote
gite remote
-
6.4.3、推送到远程仓库
远程仓库通常位于代码托管平台(如 GitHub、GitLab、码云 等)上,用于团队成员之间共享代码和协作。比如,团队中的其他成员可以从远程仓库获取您的提交和代码更改。
将本地的更改推送到 Git 远程仓库,您可以使用以下命令:
git push <远程仓库名称> <本地分支名称>:<远程分支名称>
推送之前请确保已经关联了远程仓库(参考6.4.1)
通常情况下,如果您没有指定具体的分支,Git 会默认将当前所在的本地分支推送到与之关联的远程分支。例如,如果远程仓库名为 `origin` ,您当前在 `master` 分支,且希望推送到远程的 `master` 分支,可以使用以下命令:
git push origin master
如果您的本地分支和远程分支名称不同,比如本地分支是 `feature-branch` ,而要推送到远程的 `development` 分支,那么命令如下:
git push origin feature-branch:development
另外,如果您是第一次推送某个分支到远程仓库,可能需要使用 `-u` 选项来建立本地分支和远程分支的跟踪关系,例如:
git push -u origin feature-branch
此后,再进行推送时,就可以直接使用 `git push` 而无需指定远程仓库和分支名称了。 假设您正在一个名为 `bug-fix` 的本地分支上工作,并且要将其推送到远程仓库 `origin` 上名为 `bug-fix` 的远程分支,命令就是:
git push origin bug-fix
在推送过程中,如果远程分支存在保护策略或者有其他限制,可能会导致推送失败。此时,您需要根据错误提示解决相应的问题后再进行推送。
-
6.4.4、查看本地分支与远程分支之间存在关联关系
在 Git 中,本地分支与远程分支之间存在关联关系,用于方便地进行推送和拉取操作。
默认情况下,当您首次使用 git push
推送一个本地分支时,如果没有明确指定远程分支,Git 会自动创建一个与本地分支同名的远程分支,并建立关联。例如,您首次推送本地的 master
分支,Git 会在远程创建一个名为 master
的分支,并建立关联。
可以使用 git branch -vv
命令查看本地分支与远程分支的关联关系。在输出中,会显示每个本地分支所跟踪的远程分支。
也可以使用 git branch --set-upstream-to=<远程仓库名>/<远程分支名> <本地分支名>
命令来手动设置关联关系。例如,如果要将本地的 feature
分支关联到远程 origin
仓库的 feature
分支,可以使用:
git branch --set-upstream-to=origin/feature feature
当建立了关联关系后,执行诸如 git pull
或 git push
等操作时,Git 就知道应该与哪个远程分支进行交互。假设您有一个本地分支 bugfix
,它关联到远程 origin
仓库的 bugfix
分支。当您在本地 bugfix
分支进行了一些修改,然后执行 git pull
时,Git 会从远程的 bugfix
分支拉取最新的更改并尝试合并。
另外,如果您创建了一个新的本地分支,但是没有建立与远程分支的关联,在执行 git push
时,Git 会提示您没有建立跟踪关系,需要先设置。
-
6.4.5、从远程仓库克隆
# git clone <远程仓库的 URL>
#示例:https://github.com/username/repository.git为仓库地址URL
git clone https://github.com/username/repository.git
克隆操作完成后,您就可以在本地对代码进行修改、提交等操作,并根据需要与远程仓库进行交互。
-
6.4.6、从远程仓库获取更新
-
1. git fetch
#- `git fetch` :获取所有远程仓库的更新。
git fetch#- `git fetch <仓库名称>` :
# 仅从名为 `origin` 的远程仓库获取更新。
git fetch origin#- `git fetch <仓库名称> <分支名称>` :
#从 `origin` 远程仓库获取 `master` 分支的更新。
git fetch origin master
-
2. git pull
# git pull :从默认的远程仓库(通常是 origin )获取与当前分支对应的远程分支的更新并合并。# git pull <仓库名称>
# 从 origin 远程仓库获取更新并合并。
git pull origin # git pull <仓库名称> <分支名称>
# 从 origin 远程仓库的 feature-branch 分支获取更新并合并到当前分支。
git pull origin feature-branch
-
6.5、远程仓库操作练习
##########################1-将本地仓库推送到远程仓库
# 完成4.1、4.2、4.3、4.4的操作
略
# [git_test01]添加远程仓库
git remote add origin git@gitee.com/**/**.git
# [git_test01]将master分支推送到远程仓库,并与远程仓库的master分支绑定关联关系
git push --set-upstream origin master###########################2-将远程仓库克隆到本地
# 将远程仓库克隆到本地git_test02目录下
git clone git@gitee.com/**/**.git git_test02
# [git_test02]以精简的方式显示提交记录
git-log###########################3-将本地修改推送到远程仓库
# [git_test01]创建文件file03.txt
略
# [git_test01]将修改加入暂存区并提交到仓库,提交记录内容为:add file03
git add .
git commit -m 'add file03'
# [git_test01]将master分支的修改推送到远程仓库
git push origin master###########################4-将远程仓库的修改更新到本地
# [git_test02]将远程仓库修改再拉取到本地
git pull
# 以精简的方式显示提交记录
git-log
# 查看文件变化(目录下也出现了file03.txt)
八、其他操作
-
1、查看当前仓库的状态,包括已修改、已暂存和未跟踪的文件
-
2、查看提交日志
-
3、版本回退
- 作用:版本切换
- 命令形式:git reset --hard commitID
- 如何查看已经删除的记录?
# 版本回退,commitID是版本提交时的ID,可通过git log 查看
git reset commitID --hard
-
4、添加文件至忽略列表
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
-
5、使用
git ls-files
命令,它将显示当前分支跟踪的所有文件的列表
通过切换到不同的分支,使用 git ls-files
命令查看不同分支所跟踪的列表
#使用 git ls-files 命令,它将显示当前分支跟踪的所有文件的列表
git ls-files
-
6、删除分支
在 Git 中删除分支可以使用以下命令:
-
**删除本地分支**
使用 `git branch -d <分支名称>` 命令来删除已经合并到当前分支的分支。如果分支未被合并,使用 `-d` 选项可能会失败,此时可以使用 `-D` 强制删除,但要谨慎操作,因为未合并的分支中的更改可能会丢失。 例如:
#删除分支时,需要做各种检查,可能会删除失败
git branch -d feature-branch#删除分支时,不做各种检查,强制删除
git branch -D feature-branch
-
**删除远程分支**
要删除远程分支,首先需要确保本地分支已经与远程分支同步。然后使用 `git push <远程名称> --delete <分支名称>` 命令。 例如,如果您的远程名称是 `origin` ,要删除名为 `feature-branch` 的远程分支,可以使用: ``` git push origin --delete feature-branch ```
git push origin --delete feature-branch
请注意,删除分支是不可逆的操作,所以在删除分支之前,请确保您不再需要该分支或者已经备份了其中的重要更改。
-
7、解决冲突
当 Git 提示合并过程中存在冲突时,您会在相关的文件中看到特殊的标记。这些标记通常会指出冲突的位置。HEAD表示当前分支,====以下是其他分支.
<<<<<<< HEAD
这是当前分支(通常是您要合并到的分支,比如主分支)的内容
=======
这是要合并进来的分支的内容
>>>>>>> 分支名称
删除不需要的代码和冲突标记,只保留您最终决定要保留的内容,保存文件。
使用 git add <文件名>
将解决冲突后的文件添加到暂存区,然后使用 git commit -m "解决了分支合并冲突"
提交更改。
例如:
假设有一个文件 example.txt
,在合并分支时出现冲突。冲突部分可能如下:
<<<<<<< HEAD
print("Hello from main branch")
=======
print("Hello from feature branch")
>>>>>>> feature-branch
如果您决定保留主分支的内容,就删除 =======
以下直到 >>>>>>> feature-branch
的部分。如果您想整合,比如改为 print("Hello from both branches")
,然后保存文件,进行添加和提交操作。解决冲突时要仔细检查和测试,确保合并后的代码能正常工作。
-
8、当前分支同步另一个分支的最新内容
`git rebase <分支名>` 命令用于将当前分支的提交基于 `<分支名>` 分支的最新提交进行重新排列。 这意味着它会把当前分支的提交“搬”到 `<分支名>` 分支的顶端,并以线性的方式重新排列提交历史。
优点包括:
1. 使提交历史更加整洁和线性,便于查看和理解。
2. 减少不必要的合并提交,使分支结构更清晰。
但也有一些注意事项:
1. 由于改变了提交的顺序和基础,可能会给团队协作带来困扰,如果其他人已经基于原始的提交进行了工作,可能会导致问题。
2. 在执行 `git rebase` 过程中,如果出现冲突,需要手动解决冲突,并继续执行 `git rebase --continue` 。
例如,假设您在 `feature` 分支上进行开发,并且 `master` 分支有了新的提交。执行 `git rebase master` 后,`feature` 分支上的提交会基于 `master` 分支的最新状态重新排列。如果在这个过程中,对某个文件的修改在 `feature` 分支和 `master` 分支存在冲突,Git 会提示您,您需要手动打开冲突的文件进行修改,解决冲突后执行 `git add <冲突文件>` ,然后 `git rebase --continue` 。
-
9、Git 中撤销
git rebase
操作
在 Git 中撤销 `git rebase` 操作有多种方法,以下是两种常用的方式:
**方法一:使用 `git reflog` 和 `git reset`**
1. 首先,使用 `git reflog` 命令查看 Git 的操作记录,找到 `rebase` 前的提交哈希值。
2. 然后,使用 `git reset --hard <commit_hash>` 命令将分支重置到指定的提交。`<commit_hash>` 替换为通过 `git reflog` 找到的 `rebase` 前的提交哈希值。
**方法二:使用 `ORIG_HEAD`** `rebase` 操作会将起点保存到 `ORIG_HEAD` ,通常可以直接使用以下命令进行撤销: `git reset --hard ORIG_HEAD` 但需注意,`reset`、`rebase` 和 `merge` 等操作都会将原始 `HEAD` 指针保存到 `ORIG_HEAD` 中,如果在尝试撤销 `rebase` 后执行了这些命令中的任何一个,那么可能就需要使用 `git reflog` 来找到正确的提交哈希值并进行重置。
另外,如果在撤销 `rebase` 操作之前进行了其他重要的提交,可能会导致这些提交丢失。所以在执行撤销操作之前,请确保了解其影响,并谨慎操作。同时,建议在进行任何可能有风险的操作之前,先对代码进行备份或创建新的分支,以便在需要时可以恢复到之前的状态。 例如,可以先创建一个备份分支: `git branch backup` 如果后续需要恢复到备份的状态,可以使用: `git reset --hard backup`
-
10、删除远程仓库引用(远程仓库本身不会被删除)
当本地仓库不需要与远程仓库进行交互时,可以通过命令删除远程仓库引用,首先进入本地仓库目录下,使用命令删除远程仓库引用:git remote remove <远程仓库名称>。
# git remote remove <远程仓库名称>
#命令示例,其中origin为远程仓库名称
git remote remove origin
需要注意:此操作只是从本地的 Git 配置中删除了对该远程仓库的引用,但远程仓库本身并不会被实际删除。
-
11、IDEA集成GitBash作为Terminal
九、IntelliJ IDEA中使用Git
-
1、在IDEA中配置Git
-
2、IDEA创建Git本地仓库
- 方式一、新建项目时勾选Create Git repository
- 方式二、本地项目已经创建,此时导入本地仓库
选中本地项目路径
-
3、设置远程仓库
-
4、提交到本地仓库
-
5、推送到远程仓库
-
6、从远程仓库克隆(clone)到本地
-
7、解决冲突
在pull或merge时有可能发生冲突
-
8、创建分支
-
9、切换分支
十、常见问题解决
-
1、解决Git Bash的乱码问题
打开git bash执行:git config --global core.quotepath false
通过vim编辑/etc/bash.bashrc 文件,在最后加入下面两行
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"