一. posh-git
1、下载post-git离线安装包
地址:https://files.cnblogs.com/files/xcr1234/posh-git-master.zip
2,用Powershell执行install.ps1
./install.ps1
3.用管理员权限打开powershell,修改策略:
set-executionpolicy remotesigned
Install-Module posh-git -Scope CurrentUser
Import-Module posh-git
Add-PoshGitToProfile
二.git rebase origin/main命令详解
## git rebase origin/main 命令详解
`git rebase origin/main` 是一个常用的 Git 命令,用于将当前分支的提交变基到远程主分支 `origin/main` 的最新提交上。这种操作有助于保持提交历史的整洁和线性,尤其是在多人协作开发时。以下是对该命令的详细解释和使用方法。
### **基本概念**
- **Rebase**:Rebase 是一种将一个分支的更改整合到另一个分支的方法。与 `merge` 不同,rebase 会重写提交历史,使得提交看起来像是从目标分支的最新提交开始的,从而形成一条线性的提交历史[2][3]。
- **Origin**:在 Git 中,`origin` 是默认的远程仓库名称。`origin/main` 指的是远程仓库中的 `main` 分支。
### **命令结构**
```bash
git rebase origin/main
```
这条命令的作用是将当前分支的所有提交应用到 `origin/main` 的最新提交之上。
### **使用步骤**
1. **切换到目标分支**:
在执行 rebase 之前,确保你在需要进行变基操作的分支上。例如,如果你在 `feature` 分支上工作,可以使用以下命令切换:
```bash
git checkout feature
```
2. **执行 Rebase**:
运行以下命令将当前分支的提交变基到 `origin/main`:
```bash
git rebase origin/main
```
3. **解决冲突**:
如果在变基过程中出现冲突,Git 会暂停操作并提示你解决冲突。解决完冲突后,使用以下命令继续变基:
```bash
git rebase --continue
```
4. **放弃 Rebase**:
如果决定不继续变基,可以使用以下命令放弃操作:
```bash
git rebase --abort
```
### **交互式 Rebase**
交互式 rebase 允许用户对每个提交进行更细致的控制,例如修改、合并或删除某些提交。可以使用以下命令启动交互式 rebase:
```bash
git rebase -i HEAD~N
```
其中 `N` 是要回溯的提交数量。这会打开一个编辑器,允许你对最近的 N 个提交进行操作[3][4].
### **注意事项**
- **线性历史**:使用 rebase 可以保持项目的提交历史更加线性和整洁,这对于代码审查和理解项目进展非常有帮助[2][5].
- **强制推送**:如果在本地进行了 rebase 操作,且该分支已经推送到远程仓库,你需要使用强制推送(`git push --force`)将更改推送到远程,因为变基会改变提交历史[4][6].
- **避免混淆**:确保在执行 `git rebase origin/main` 时,不要误用 `git rebase origin main`,后者会导致不同的结果并可能引发冲突[1].
通过掌握 `git rebase origin/main` 的用法,可以有效地管理 Git 提交历史,提高团队协作效率。
Citations:
[1] git rebase origin master 和 origin/master-优快云博客
[2] git rebase 用法详解与工作原理 | Shall We Code?
[4] git push origin master是什么意思_【Git】 rebase 和 merge 的正确使用姿势 - 迷走神经 - 博客园
[5] https://juejin.cn/post/6969101234338791432
[6] git rebase vs git merge详解【转】 - 样sir - 博客园
[7] gitrebase远程分支 • Worktile社区
三.Git rebase的步骤
## Git Rebase的步骤
`git rebase` 是一种将当前分支的提交应用到另一个基底分支上的方法,通常用于保持提交历史的整洁。以下是使用 `git rebase` 的基本步骤:
### **步骤详解**
1. **切换到目标分支**:
首先,确保你在需要进行变基操作的分支上。例如,如果你在 `feature` 分支上工作,可以使用以下命令切换:
```bash
git checkout feature
```
2. **确保主分支是最新的**:
切换到主分支并更新它,以确保你要变基到的目标分支是最新的:
```bash
git checkout main
git pull origin main
```
3. **切换回开发分支**:
再次切换回你的开发分支:
```bash
git checkout feature
```
4. **执行 Rebase**:
使用以下命令将当前分支的提交变基到主分支上:
```bash
git rebase main
```
5. **解决冲突(如果有)**:
如果在变基过程中出现冲突,Git 会暂停操作并提示你解决冲突。使用 `git status` 查看冲突文件,并手动解决这些冲突。
6. **标记已解决的冲突**:
解决完冲突后,使用以下命令将解决后的文件标记为已解决:
```bash
git add <file>
```
7. **继续 Rebase 操作**:
使用以下命令继续变基操作,直到所有提交都被应用:
```bash
git rebase --continue
```
8. **放弃 Rebase(如果需要)**:
如果决定不继续变基,可以使用以下命令放弃操作并返回到变基前的状态:
```bash
git rebase --abort
```
9. **完成后推送更改**:
如果一切顺利,最后你可能需要将更改推送到远程仓库。如果你的更改已经推送过,需要使用强制推送:
```bash
git push --force origin feature
```
### **注意事项**
- 在进行 `rebase` 操作之前,确保工作目录是干净的,没有未提交的更改。
- 避免在已经推送到远程仓库的提交上执行 `rebase`,因为这可能导致提交历史混乱。
- 在处理冲突时,要仔细检查代码,以确保最终合并后的代码正确无误。
通过遵循这些步骤,你可以有效地使用 `git rebase` 来管理和整理你的 Git 提交历史。
Citations:
[1] git rebase 用法详解与工作原理 - 简简单单
[2] Git - 变基
四.git通过通过命令合并commit
在 Git 中,合并多个提交(commits)可以通过 `git rebase` 命令实现。以下是合并提交的详细步骤:
## 合并多个提交的步骤
### **1. 查看提交历史**
首先,使用 `git log` 命令查看当前分支的提交历史,以确定需要合并的提交数量和内容。
```bash
git log
```
### **2. 启动交互式 Rebase**
使用 `git rebase -i` 命令启动交互式变基。你可以选择从当前提交向后合并 `n` 个提交,命令格式如下:
```bash
git rebase -i HEAD~n
```
例如,如果要合并最近的三个提交,可以运行:
```bash
git rebase -i HEAD~3
```
### **3. 编辑 Rebase 操作**
执行上述命令后,会打开一个文本编辑器,显示最近的 `n` 个提交。每个提交前面都有一个操作指令(如 `pick`)。你可以根据需求修改这些指令:
- **pick**:保留该提交。
- **squash**(缩写为 `s`):将该提交与前一个提交合并。
- **fixup**(缩写为 `f`):与前一个提交合并,但不保留该提交的信息。
- **reword**(缩写为 `r`):保留该提交,但修改其注释。
例如,如果要将第二个和第三个提交合并到第一个提交中,可以将操作修改为:
```
pick 85697ee This is first commit.
squash ee461c1 This is second commit.
squash 326e415 This is third commit.
```
### **4. 保存并退出编辑器**
完成编辑后,保存文件并退出编辑器。Git 将会开始合并操作。如果有冲突,Git 会提示你解决冲突。
### **5. 解决冲突(如果有)**
如果在合并过程中出现冲突,使用 `git status` 查看冲突文件,手动解决这些冲突。解决完冲突后,将更改标记为已解决:
```bash
git add <file>
```
然后继续变基操作:
```bash
git rebase --continue
```
### **6. 完成合并**
如果没有冲突或所有冲突都已解决,Git 会要求你编辑合并后的提交信息。你可以将多个提交的信息整合成一个新的注释。
完成后保存退出,最终会完成多个提交的合并。
### **7. 放弃 Rebase(如果需要)**
如果在过程中决定不继续,可以使用以下命令放弃变基操作:
```bash
git rebase --abort
```
通过以上步骤,你可以有效地在 Git 中合并多个 commits,使得项目的历史更加整洁和易于管理。
Citations:
五.使用git reset 命令合并commit
使用 `git reset` 命令合并多个提交是一种有效的方法,尤其是在你想要将多个提交压缩成一个提交时。以下是详细的步骤和示例说明。
## 使用 `git reset` 合并提交
### **1. 查看提交历史**
首先,使用 `git log` 命令查看当前分支的提交历史,以确定需要合并的提交数量和内容。
```bash
git log
```
这将显示提交的哈希值、作者、日期和提交信息。找到你想要合并的提交的哈希值。
### **2. 确定要合并到的提交**
假设你有以下提交历史:
```
commit 3a2b1c4 (HEAD -> feature)
Author: User <user@example.com>
Date: Mon Dec 23 12:00:00 2024 +0000
Commit message for third commit
commit 2b1c4d5
Author: User <user@example.com>
Date: Sun Dec 22 12:00:00 2024 +0000
Commit message for second commit
commit 1a2b3c4
Author: User <user@example.com>
Date: Sat Dec 21 12:00:00 2024 +0000
Commit message for first commit
```
如果你想将第二个和第三个提交合并到第一个提交中,可以选择将 HEAD 指向第一个提交。
### **3. 使用 `git reset` 命令**
运行以下命令将 HEAD 移动到你想要合并到的提交(在这个例子中是第一个提交):
```bash
git reset --soft HEAD~2
```
这里的 `HEAD~2` 表示将 HEAD 移动到当前分支的前两个提交(即第一个提交)。使用 `--soft` 参数意味着重置后保留工作区和索引中的更改。
### **4. 提交更改**
在执行重置后,所有被重置的提交的更改现在都在暂存区中。你可以使用以下命令创建一个新的合并提交:
```bash
git commit -m "Combined second and third commits into one"
```
这将创建一个新的提交,其中包含之前第二个和第三个提交的所有更改。
### **5. 查看结果**
再次使用 `git log` 查看新的提交历史,你会看到第二个和第三个提交已经被合并为一个新提交。
```bash
git log
```
### **注意事项**
- **数据丢失风险**:使用 `git reset --hard` 将永久删除未保存的更改,因此在执行此操作之前,请确保没有未保存的重要更改。
- **推送更改**:如果你已经将这些更改推送到远程仓库,可能需要使用强制推送来更新远程分支:
```bash
git push origin feature --force
```
- **团队协作**:在团队协作中,重写历史可能会导致其他开发者的问题,因此应谨慎使用此方法,并确保与团队成员沟通。
通过上述步骤,你可以有效地使用 `git reset` 命令来合并多个 commits,使得 Git 提交历史更加整洁。
Citations:
[1] Git 撤销合并——如何在 Git 中恢复之前的合并提交
[4] https://juejin.cn/post/7052255285108277279
七.git中多个commit合并成为一个commit,
将多个Git提交合并成一个提交的过程被称为"压缩提交"。你可以使用 `git rebase` 命令来实现这个目的。以下是详细的解决方案和示例说明:
### 步骤1:查看提交历史
首先,查看当前分支的提交历史,确定需要合并的提交。使用以下命令:
```sh
git log --oneline
```
### 步骤2:开始交互式变基
假设你想合并最近的三个提交,使用以下命令开始交互式变基:
```sh
git rebase -i HEAD~3
```
### 步骤3:编辑提交信息
在交互式变基编辑器中,你会看到最近三个提交的列表。它们的格式如下:
```
pick <commit1>
pick <commit2>
pick <commit3>
```
将除第一个提交之外的提交前面的 `pick` 改为 `squash`(可以简写为 `s`):
```
pick <commit1>
squash <commit2>
squash <commit3>
```
保存并关闭编辑器。
### 步骤4:编辑合并后的提交消息
Git会打开一个新的编辑器窗口,让你编辑合并后的提交消息。你可以保留原始提交消息的内容,也可以编写新的提交消息。保存并关闭编辑器。
### 步骤5:完成变基
完成变基后,你可以使用以下命令查看提交历史,确保多个提交已成功合并为一个提交:
```sh
git log --oneline
```
### 示例
假设你的提交历史如下:
```sh
abc1234 First commit
def5678 Second commit
ghi7890 Third commit
```
你想将它们合并为一个提交。使用以下步骤:
1. **查看提交历史**:
```sh
git log --oneline
```
2. **开始交互式变基**:
```sh
git rebase -i HEAD~3
```
3. **编辑提交信息**:
将以下内容:
```
pick abc1234 First commit
pick def5678 Second commit
pick ghi7890 Third commit
```
改为:
```
pick abc1234 First commit
squash def5678 Second commit
squash ghi7890 Third commit
```
4. **编辑合并后的提交消息**:
编写新的提交消息,例如:
```
git push -f
八.通过git将最近一次提交到远程仓库的代码回退
要将最近一次提交到远程仓库的代码回退,你可以按照以下步骤操作。这包括使用 `git reset` 命令在本地回退提交,然后强制推送更改到远程仓库。
### 操作步骤
#### 1. 检查提交历史
首先,查看当前分支的提交历史,以确保你知道需要回退的提交。使用以下命令:
```sh
git log --oneline
```
#### 2. 回退最近一次提交
使用 `git reset` 命令将分支回退到上一个提交。这会将最近的提交移到暂存区,保留更改:
```sh
git reset --soft HEAD~1
```
如果你想完全删除最近的提交和它的更改,可以使用 `--hard` 参数:
```sh
git reset --hard HEAD~1
```
#### 3. 强制推送更改到远程仓库
使用 `git push --force` 将本地更改强制推送到远程仓库。这将覆盖远程仓库的最新提交:
```sh
git push --force
```
### 示例
假设你最近的提交信息如下:
```sh
abc1234 Added new feature
```
你想回退这个提交,操作步骤如下:
1. **查看提交历史**:
```sh
git log --oneline
```
2. **回退最近一次提交**:
使用 `--soft` 参数保留更改:
```sh
git reset --soft HEAD~1
```
3. **强制推送更改到远程仓库**:
```sh
git push --f
```
### 注意事项
- **慎用 `git reset --hard`**:使用 `--hard` 参数会丢失未提交的更改,操作前请确保你不需要这些更改。
- **强制推送**:`git push --force` 会覆盖远程仓库的历史,因此在使用前请确保你已备份重要数据,并告知团队成员以避免冲突。
九.修改最后一个commit
git add .
git commit --amend
git push -f origin 分支名称
十.git stash ,git stash命令的应用场景
git stash命令在开发过程中非常有用,尤其是当你需要切换分支但又不想提交当前工作进度的时候。以下是它的一些典型应用场景和详细解决方案:
应用场景一:临时保存工作进度
场景描述:你正在处理某个任务,但突然需要修复另一个分支上的紧急bug,不想提交未完成的工作。 解决方案:
bash
# 暂存当前工作进度
git stash
# 切换到需要修复bug的分支
git checkout bugfix-branch
# 修复bug并提交
git commit -m "Fix critical bug"
# 切换回之前的工作分支
git checkout my-feature-branch
# 恢复暂存的工作进度
git stash pop代码含义:
- git stash:保存当前工作进度到一个堆栈中。
- git checkout [branch-name]:切换到指定的分支。
- git commit -m "message":提交修改并附加注释。
- git stash pop:从堆栈中取出最近保存的工作进度并应用。
十一.git在错误的分支写了代码,怎么通过git命令的方式将代码放在正确的分支上
### 详细解决方案
1. **暂存当前修改**:
```bash
# 暂存当前所有未提交的修改
git stash
```
2. **切换到正确的分支**:
```bash
# 切换到你想要将代码移到的正确分支
git checkout correct-branch
```
3. **应用暂存的修改**:
```bash
# 恢复之前暂存的修改
git stash pop
```
4. **检查并提交更改**:
```bash
# 查看修改是否正确应用
git status
# 提交这些修改
git commit -m "Move changes to the correct branch"
```
### 代码解释
- `git stash`:暂存当前分支上的所有未提交修改。
- `git checkout [branch-name]`:切换到指定的分支。
- `git stash pop`:恢复最近一次暂存的修改。
- `git status`:查看工作目录和暂存区的状态。
- `git commit -m "message"`:将修改提交到当前分支并附加注释。
### 应用场景示例
假设你在分支`wrong-branch`上进行了修改,但应该是在`right-branch`上完成这些修改:
```bash
# 暂存当前修改
git stash
# 切换到正确的分支
git checkout right-branch
# 应用暂存的修改
git stash pop
# 查看状态
git status
# 提交修改
git commit -m "Move changes to the correct branch"
十二.Cherry-pick
十三.将多次提交的某些文件进行回滚
PS D:\workspace\mes-java>
PS D:\workspace\mes-java> git log
commit 9831d83666510a34d5a1aafd1734c5809aa12f28 (HEAD -> lc/2387-2, origin/lc/2387-2)
Date: Fri Jan 10 17:43:45 2025 +0800
feat:检验工单-过程检添加 #2387
feat:检验工单审批状态修改 #2387
feat:检验工单,派工接口优化 #2387
feat:检验工单审批状态修改03 #2387
feat:检验方法格式问题 #2387
commit 6ccaf2d28bbe189377c0a75d76f8fa6aa9bab443 (origin/main, origin/HEAD, main)
Date: Mon Jan 13 18:42:01 2025 +0800
feat:导出工艺树
commit d62c37a5a4e2d2743f5848df408379c44d95a2b3
Date: Mon Jan 13 11:18:31 2025 +0800
feat:作业中心状态查询修改 #422
commit 21a1c0b46d1975a2b7813631d04f779379cbc73e
Date: Mon Jan 13 17:21:14 2025 +0800
PS D:\workspace\mes-java>
PS D:\workspace\mes-java> git reset --soft 6ccaf2d28bbe189377c0a75d76f8fa6aa9bab443
PS D:\workspace\mes-java> git add .
PS D:\workspace\mes-java> git commit -m " feat:检验工单-过程检添加 #2387
>>
>> feat:检验工单审批状态修改 #2387
>>
>> feat:检验工单,派工接口优化 #2387
>>
>> feat:检验工单审批状态修改03 #2387
>>
>> feat:检验方法格式问题 #2387"
[lc/2387-2 0d9ecc76] feat:检验工单-过程检添加 #2387
12 files changed, 279 insertions(+), 212 deletions(-)
PS D:\workspace\mes-java> git push -f lc/2387-2
fatal: 'lc/2387-2' does not appear to be a git repository
fatal: Could not read from remote repository.
git push -f
Enumerating objects: 104, done.
Counting objects: 100% (104/104), done.
Delta compression using up to 20 threads
Compressing objects: 100% (33/33), done.
Writing objects: 100% (60/60), 7.09 KiB | 2.36 MiB/s, done.
Total 60 (delta 24), reused 0 (delta 0), pack-reused 0
remote:
十四.git和main主分支不同步
Windows PowerShell
版权所有(C) Microsoft Corporation。保留所有权利。
安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows
D:\workspace\mes-java [lc/2708 ≡]> git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
D:\workspace\mes-java [main ≡]> git pull
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 14 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (14/14), 10.91 KiB | 189.00 KiB/s, done.
954b3b49..5a8e6444 main -> origin/main
Updating 954b3b49..5a8e6444
Fast-forward
Windows PowerShell
版权所有(C) Microsoft Corporation。保留所有权利。
安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows
D:\workspace\mes-java [lc/2708 ≡]> git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
D:\workspace\mes-java [main ≡]> git pull
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 14 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (14/14), 10.91 KiB | 189.00 KiB/s, done.
954b3b49..5a8e6444 main -> origin/main
Updating 954b3b49..5a8e6444
Fast-forward
jeecg-module-manufacture/src/main/java/org/jeecg
1 file changed, 8 insertions(+), 3 deletions(-)
D:\workspace\mes-java [main ≡]> git checkout lc/2708
Switched to branch 'lc/2708'
Your branch is up to date with 'origin/lc/2708'.
D:\workspace\mes-java [lc/2708 ≡]> git rebase main
Successfully rebased and updated refs/heads/lc/2708.
D:\workspace\mes-java [lc/2708 ↓1 ↑2]> git push -f
1 file changed, 8 insertions(+), 3 deletions(-)
D:\workspace\mes-java [main ≡]> git checkout lc/2708
Switched to branch 'lc/2708'
Your branch is up to date with 'origin/lc/2708'.
D:\workspace\mes-java [lc/2708 ≡]> git rebase main
Successfully rebased and updated refs/heads/lc/2708.
D:\workspace\mes-java [lc/2708 ↓1 ↑2]> git push -f