Git

Git

初始化

...

基础操作

  • git init: 初始化当前文件夹作为一个git项目
  • git add .: 将当前文件夹下所有的文件添加到 暂存区
  • git commit -m "在双引号里输入你想提交的信息": 提交暂存区中的文件到 本地存储库

分支

  • git switch -c <branch-name>:创建并切换到新分支(推荐,Git 2.23+)。
  • git checkout -b <branch-name>:创建并切换到新分支(适用于较旧版本的 Git)
  • 创建分支并上传到远端仓库
    1. 创建并切换到分支

      git switch -c <branch-name>
      或者
      git checkout -b <branch-name>

    2. 上传

      git init
      git add .
      git commit -m "first commit"

    3. 当你使用 git push -u origin <branch-name> 设置了上游分支后,Git 会将当前本地分支(在这个例子中是 <branch-name>)与远程仓库中的 <branch-name> 分支建立跟踪关系。这意味着以后在 <branch-name> 上执行 git push 或 git pull 时,Git 会自动知道要与哪个远程分支进行交互

      git push -u origin <branch-name>

merge与rebase

merge

git merge

# 切换到目标分支
git checkout 主分支

# 将其他分支合并到当前分支
git merge 特性分支

# 如果有冲突,解决冲突后添加解决的文件
git add .

# 完成合并
git commit

git merge --abort
尝试取消当前的合并过程,并将你的工作目录恢复到合并开始前的状态。这是在合并尚未完成(即未commit)时取消合并的标准方法。

rebase 变基

交互式变基(Interactive Rebase)

这是最灵活的方式之一,允许你挑选、编辑、压缩或者删除提交
当有多个commit的时候,希望把多个commit合并成一个完整的commit。
git loggit log --oneline查看提交历史的编号
假设现在有以下几个commit,现在觉得add 1, add 2,add 3其实可以合并成一个commit:add1~3

(Head->master) add 3
add 2
add 1
init

  • 首先,假设现在HEAD在add 3,git rebase HEAD~3,希望合并前三个commit。
  • 之后将编辑交互式变基列表:
    这将打开一个文本编辑器,列出最近的3次提交。每一行代表一个提交,并以pick开头。要合并提交,只需将除第一个之外的所有提交前的pick改为squash(或简写s)。这会告诉Git将这些提交与前面的提交合并。
  • 保存并关闭编辑器:
    完成后保存更改并关闭编辑器。Git会开始应用你的修改。对于每个被标记为squash的提交,它还会提示你编辑合并后的提交信息。
  • 完成变基:
    最后一步是确认合并后的提交信息,然后保存退出。这样就完成了提交的合并。
直接通过重置和暂存区操作

这种方法适用于当你想把一系列提交压缩成一个新的提交。

  • 找到起点之前的最后一次提交的哈希值:
    比如说你想从init开始合并之后的所有提交。

git log --oneline

  • 软重置到那个提交:
    使用git reset命令进行软重置(不会影响工作目录中的文件)。

git reset --soft [init的哈希值]

  • 重新提交所有更改:
    现在所有的改动都处于暂存状态,你可以创建一个新的提交。

git commit -m "合并后的提交信息"

比较代码

idea的图形化工具很方便
image

远程

  • git remote -v: 验证远程仓库
    image

高级操作

1

需求:将某个分支,指定commit之后的提交回滚,并将这个commit之后的提交,合并到另一个新的分支上。
操作:

  1. 查看提交历史

    git log --oneline

  2. 创建一个临时分支(可选但推荐):为了防止误操作丢失提交,可以先创建一个临时分支保存当前状态

    git branch temp-branch

  3. 回退当前分支到指定 commit(保留更改为未提交状态)
    3.1. 如果你想保留更改内容(只是撤销提交),使用:

    git reset --soft abc1234

    3.2. 如果你想删除这些更改(完全回退):

    git reset --hard abc1234

    3.3. 如果你已经push到远程,需要force强制回退

    git push origin <你的分支(HEAD表示与当前分支一致的远程分支)> --force
    git push origin HEAD --force

  4. 获取从 abc1234 到原分支顶端的所有提交 hash
    查看从 abc1234 之后的提交:

    git log abc1234..temp-branch --oneline

    记录下这些提交的 hash(比如 commit1, commit2, ...)

  5. 将这些提交应用到另一个分支(比如 feature)
    切换到目标分支

    git checkout feature

    然后依次 cherry-pick 提交(或 rebase):

    方法 A:逐个 cherry-pick

    git cherry-pick commit1
    git cherry-pick commit2
    ...

    方法 B:交互式 rebase(更适用于连续提交)

    git rebase abc1234 temp-branch

    这会把 temp-branch 上从 abc1234 之后的所有提交重新应用到当前分支上

Q: 我不想修改原分支(main),只想提取提交合并到别的分支怎么办?
A: 不用 reset 原分支,直接用 rebase 或 cherry-pick 即可。

git checkout feature
git rebase abc1234 main

git rebase 很强大,但它是“改写历史”的操作,适用于本地私有分支或尚未共享的提交;对于远程分支或多人协作分支,请谨慎使用,避免强制推送带来的混乱

posted @ 2024-12-09 15:02  chendsome  阅读(33)  评论(0)    收藏  举报