Git 实用学习文档
Git 基本概念
版本控制: Git是一种分布式版本控制系统,用于跟踪和管理文件和项目的更改历史。版本控制使你能够记录文件的每个修改,并在需要时恢复到先前的版本。
仓库: Git使用仓库(Repository)来存储项目的文件和版本历史。仓库可以是本地的(本地仓库)或远程的(远程仓库)。本地仓库位于本地计算机上,而远程仓库位于共享服务器上,可以供多人协作使用。
提交(Commit): 提交是Git中的基本单位,表示对项目的一次更改。当你对文件进行修改后,需要将这些更改记录为一个提交。每个提交都有一个唯一的标识符,可以用来查看和恢复到该提交的状态。
分支(Branch): 分支允许在同一个仓库中并行开发多个功能或修复不同的bug。每个分支都是仓库中的一个独立的版本。你可以在一个分支上进行开发,并在完成后将更改合并到主分支或其他分支。
Git有四个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)、git仓库(Remote Directory)。文件在这四个区域之间的转换关系如下:
Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
//git 最常用的相关命令
git init
git init [project-name]
git clone [url]
git status
git log
git config --global user.name "name"
git config --global user.email "email"
git config
git add .
git stash
git commit -m "info"
git push
git pull
git branch //显示分支 本地
git branch -r //显示远程分支
git branch -a // 显示本地 + 远程 分支
git branch -r -d origin/yw_local //删除远程分支
git branch br_name //创建分支名
git checkout br_name//移动到分支名
- 使用命令 `git fetch --prune` 就可以删除本地仓库上,远程仓库已经不在了的分支。
git cherry-pick commit-hash //提交这次本地更改
git cherry-pick <A> <B> //A和B都提交
git cherry-pick A..B //从 A 到 B 的所有提交,不包括A
git cherry-pick A^..B //从 A 到 B 的所有提交,包括A
Git 初始化
当使用Git进行初始化和配置时,以下是一些常用的命令和操作:
1. 初始化新的本地仓库:
git init
运行git init
命令可以将当前目录转变为Git仓库。它会在当前目录下创建一个名为.git
的隐藏文件夹,用于存储Git仓库的相关信息。
2. 初始化指定项目名称的本地仓库:
git init [project-name]
可以使用git init [project-name]
命令在指定的目录下创建一个新的Git仓库,同时指定一个项目名称。这将在指定目录中创建一个名为.git
的隐藏文件夹。
3. 克隆远程仓库到本地:
git clone [url]
运行git clone [url]
命令可以克隆一个远程仓库到本地。将[url]
替换为远程仓库的URL,Git将在当前目录下创建一个与远程仓库同名的文件夹,并复制所有文件和提交历史到本地。
4. 配置用户名和邮箱:
git config --global user.name "name"
git config --global user.email "email@work.com"
使用git config --global user.name "name"
和git config --global user.email "email@work.com"
命令可以配置全局的用户名和邮箱。将"name"
替换为你的用户名,将"email@work.com"
替换为你的邮箱地址。
5. 查看配置信息:
git config --global user.name
git config --global user.email
运行git config --global user.name
和git config --global user.email
命令可以查看当前配置的用户名和邮箱。
以上是关于初始化和配置Git的一些常用命令和操作。通过使用这些命令,你可以创建新的本地仓库,克隆远程仓库,查看状态和提交历史,并配置全局的用户名和邮箱信息。
Git 工作流程
基本的Git工作流程包括以下常用操作:添加文件、提交更改、查看状态、撤销修改等。下面是对每个操作的详细说明:
1. 添加文件: 使用git add
命令将文件添加到暂存区,准备进行提交。你可以添加指定的文件或整个目录。
-
添加单个文件:
git add <file_name>
将
<file_name>
替换为要添加的文件名。 -
添加整个目录:
git add .
这会将当前目录下的所有文件添加到暂存区。
2. 提交更改: 使用git commit
命令将暂存区的更改提交到版本库。在提交时,需要提供一个有意义的提交消息来描述这次更改的内容。
-
提交已暂存的文件:
git commit -m "commit message"
将commit message替换为你的提交消息。
3. 查看状态: 使用git status
命令可以查看当前仓库的状态,包括已修改、已暂存和未跟踪的文件。
-
查看仓库状态:
git status
这将显示当前分支的状态以及有关文件的信息,例如已修改、已暂存或未跟踪的文件。
4. 撤销修改: 如果你对文件做出了修改但尚未将其添加到暂存区,可以使用以下命令撤销修改。
-
撤销对文件的修改:
git checkout -- <file_name>
将<file_name>替换为要撤销修改的文件名。这将还原文件到上一次提交的状态。
5. 查看提交历史: 使用git log
命令可以查看当前分支的提交历史,以及每个提交的相关信息。
-
查看提交历史:
git log
这将显示提交的哈希值、作者、日期和提交消息等信息。
6. 查看当前仓库状态: git status
命令用于查看当前仓库的状态。它会显示已修改、已暂存和未跟踪的文件,以及分支的信息等。
运行以下命令来查看仓库的状态:
git status
Git将返回一些关键信息,包括:
- 当前分支的名称。
- 与上次提交相比是否有文件的修改。
- 是否有文件已添加到暂存区。
- 是否有未跟踪的文件。
状态信息可能包括以下几种情况:
- “On branch <branch_name>”:指示当前所在的分支。
- “Changes not staged for commit”:表示有已修改但未添加到暂存区的文件。
- “Changes to be committed”:表示有已暂存但尚未提交的文件。
- “Untracked files”:表示有未跟踪的文件。
以上是基本的Git工作流程。通过添加文件、提交更改、查看状态和撤销修改等操作,你可以有效地管理你的项目并跟踪项目的版本历史。这些操作是日常开发中使用频率较高的命令,对于掌握基本的Git工作流程非常重要。
Git 远程仓库
远程仓库是位于网络上的Git仓库,用于协作开发、备份代码或与他人共享代码。Git提供了一系列命令来与远程仓库进行交互,包括添加、删除、重命名远程仓库,以及推送和拉取更改等操作。
下面是关于远程仓库的常用操作及相应的Git命令的详细说明:
1. 添加远程仓库: 使用git remote
命令来添加远程仓库。
-
添加一个远程仓库:
git remote add <remote_name> <remote_url>
将<remote_name>替换为远程仓库的名称,将<remote_url>替换为远程仓库的URL。通过指定名称和URL,将远程仓库与本地仓库关联起来。
2. 删除远程仓库: 使用git remote
命令来删除远程仓库。
-
删除一个远程仓库:
git remote remove <remote_name>
将<remote_name>替换为要删除的远程仓库的名称。通过指定名称,将删除与该名称关联的远程仓库。
3. 重命名远程仓库: 使用git remote
命令来重命名远程仓库。
-
重命名一个远程仓库:
git remote rename <old_remote_name> <new_remote_name>
将<old_remote_name>替换为要重命名的远程仓库的旧名称,将<new_remote_name>替换为新的名称。通过指定旧名称和新名称,将远程仓库的名称改为新的名称。
4. 推送更改到远程仓库: 使用git push
命令将本地仓库的更改推送到远程仓库。
-
推送当前分支的更改到远程仓库:
git push <remote_name> <branch_name>
将<remote_name>替换为远程仓库的名称,将<branch_name>替换为要推送的分支的名称。通过指定远程仓库和分支名称,将本地仓库的更改推送到远程仓库。也可以直接
git push
推送到当前的仓库分支。
5. 拉取远程仓库的更改: 使用git pull
命令从远程仓库获取最新的更改并合并到本地仓库。
-
拉取远程仓库当前分支的更改并合并到本地分支:
git pull <remote_name> <branch_name>
将<remote_name>替换为远程仓库的名称,将<branch_name>替换为要拉取的分支的名称。通过指定远程仓库和分支名称,将远程仓库的最新更改拉取到本地仓库,并自动合并到当前分支。也可以直接
git pull
拉取到当前的仓库分支。
6. 获取远程仓库的更改: 使用git fetch
命令从远程仓库获取最新的更改,但不自动合并到本地分支。
-
获取远程仓库当前分支的最新更改:
git fetch <remote_name> <branch_name>
将<remote_name>替换为远程仓库的名称,将<branch_name>替换为要获取的分支的名称。通过指定远程仓库和分支名称,将远程仓库的最新更改获取到本地仓库,但不自动合并到当前分支。也可以直接
git fetch
获取到当前的仓库分支。
以上是与远程仓库进行交互的一些常用操作及相应的Git命令。这些命令可以帮助你与远程仓库进行协作、备份代码以及获取最新的更改。使用这些命令,你可以有效地管理你的项目并与他人共享代码。
Git 分支管理
分支管理在Git中是非常重要的,它允许并行开发不同的功能或修复bug,并帮助团队高效协作。下面将介绍如何创建、切换、合并和删除分支,并介绍常见的分支管理策略,以及简要介绍git cherry-pick
命令。
1. 创建分支: 使用git branch
命令来创建新的分支。
-
创建一个新分支:
git branch <branch_name>
将 <branch_name>替换为新分支的名称。这个命令会在当前所在的提交上创建一个新的分支,但不会切换到新分支。
2. 切换分支: 使用git checkout
命令或git switch
命令来切换到已存在的分支。
-
切换到已存在的分支:
git checkout <branch_name>
或
git switch <branch_name>
将<branch_name>替换为要切换到的分支名称。这个命令会将工作目录切换到指定的分支,并将HEAD指向该分支。switch为Git2.23以上版本才有的,是为了更清晰的见名知意。
3. 合并分支: 使用git merge
命令来合并指定分支到当前分支。
-
将指定分支合并到当前分支:
git merge <branch_name>
将<branch_name>替换为要合并到当前分支的分支名称。合并会将指定分支的更改合并到当前分支。
git cherry-pick命令: git cherry-pick
命令用于将指定的提交(commit)应用到当前分支,它允许你选择性地将某个提交应用到当前分支,而不是进行整个分支的合并。
-
使用git cherry-pick命令:
git cherry-pick <commit_hash>
将<commit_hash>替换为要应用的提交的哈希值(可以通过
git log
查看)。这个命令会将指定提交的更改应用到当前分支。git cherry-pick commit-hash //提交这次本地更改 git cherry-pick <A> <B> //A和B都提交 git cherry-pick A..B //从 A 到 B 的所有提交,不包括A git cherry-pick A^..B //从 A 到 B 的所有提交,包括A
4. 删除分支: 使用git branch
命令来删除已存在的分支。
-
删除一个已存在的分支:
git branch -d <branch_name>
将<branch_name>替换为要删除的分支名称。这个命令会删除指定的分支。
5. 常见的分支管理策略:
- 特性分支:对于新功能的开发,可以基于主分支创建一个新的特性分支,进行开发和测试,开发完成后再合并回主分支。
- 发布分支:用于发布软件版本,可以在主分支的基础上创建一个发布分支,只进行Bug修复和小的改动,不再加入新的功能,确保发布版本的稳定性。
- 长期支持分支:对于长期维护的版本,可以创建长期支持分支,用于接收重要的Bug修复,确保老版本的稳定性。
解决冲突
在Git中,当进行分支合并时可能会发生冲突,即不同分支对同一部分代码进行了修改。解决冲突的一般步骤如下:
-
在合并分支之前,先使用
git fetch
或git pull
命令获取远程仓库的最新更改。 -
使用
git merge
或git rebase
命令将一个分支合并到当前分支。如果发生冲突,Git会将冲突标记在文件中。 -
打开包含冲突的文件,手动编辑文件解决冲突。冲突部分会被标记为类似以下形式的内容:
code<<<<<<< HEAD // 当前分支的修改 ======= // 合并分支的修改 >>>>>>> branch_name
在编辑文件时,选择保留需要的更改,并删除冲突标记。
-
解决冲突后,使用
git add
命令将修改的文件标记为已解决状态。 -
使用
git commit
命令提交解决冲突的修改。
如果对手动解决冲突不太熟悉,也可以使用图形化的合并工具来解决冲突。
撤销和回退
在Git中,可以使用以下命令来撤销提交、回退到之前的提交状态或恢复删除的文件。
-
撤销提交:
git revert <commit_hash>
将
<commit_hash>
替换为要撤销的提交的哈希值。这个命令会创建一个新的提交,以撤销指定提交的更改。 -
回退到之前的提交状态:
git reset <commit_hash>
将
<commit_hash>
替换为要回退到的提交的哈希值。这个命令会将当前分支的HEAD指针移动到指定的提交,丢弃之后的提交。 -
恢复删除的文件:
git restore <file_path>
将
<file_path>
替换为要恢复的文件路径。这个命令会将文件恢复到最新的提交状态。
需要注意的是,撤销提交和回退提交是不同的操作。git revert
会创建一个新的提交,以撤销指定提交的更改,而git reset
会移动HEAD指针丢弃部分或全部的提交。
常见问题
常见问题和对应的故障排除技巧:
- 修复损坏的仓库:
- 使用
git fsck
命令来检查仓库的完整性,并查找潜在的问题。 - 尝试使用
git reflog
命令来查看仓库的操作记录,并找回可能丢失的提交。
- 使用
- 恢复丢失的提交:
- 如果在本地操作时不小心删除了提交,可以使用
git reflog
命令来找回丢失的提交。 - 如果在推送到远程仓库后删除了提交,可以与团队协商并进行合适的回滚或修复操作。
- 如果在本地操作时不小心删除了提交,可以使用
- 解决冲突:
- 当合并分支时,如果发生冲突,使用
git status
命令查看冲突文件的位置和状态。 - 手动编辑冲突文件,解决冲突并使用
git add
命令标记为已解决。 - 继续进行合并操作,然后使用
git commit
提交合并结果。
- 当合并分支时,如果发生冲突,使用
- 远程仓库访问问题:
- 确保远程仓库的URL正确,可以使用
git remote -v
命令查看远程仓库的URL。 - 检查网络连接是否正常,尝试使用
ping
命令或通过浏览器访问远程仓库的URL。 - 如果是SSH协议,确保SSH密钥正确设置并与远程仓库关联。
- 确保远程仓库的URL正确,可以使用
- 错误的操作回滚:
- 如果在本地操作中误删除或修改了文件,可以使用
git checkout
命令来恢复文件到最新的提交状态。 - 如果需要撤销提交,可以使用
git revert
或git reset
命令进行撤销或回退操作。
- 如果在本地操作中误删除或修改了文件,可以使用
以上是一些常见问题和故障排除的技巧,但具体的解决方法可能因情况而异。在遇到问题时,可以参考Git的官方文档、查找相关的教程或在开发社区中寻求帮助。