git

工作中常用到的命令

远端代码和自己的代码相同时,最后一次提交的哈希值都是相同

1.git clone // 到本地 

2.git checkout -b xxx 切换至新分支xxx (相当于复制了remote的仓库到本地的xxx分支上 

3.修改或者添加本地代码(部署在硬盘的源文件上)

 4.git diff 查看自己对代码做出的改变

 5.git add 上传更新后的代码至暂存区

 6.git commit 可以将暂存区里更新后的代码更新到本地git 

7.git push origin xxx 将本地的xxxgit分支上传至github上的git 

如果在写自己的代码过程中发现远端GitHub上代码出现改变,自己修改代码时候远端的仓库中进行提交

1.git checkout main 切换回main分支 

2.git pull origin master(main) 将远端修改过的代码再更新到本地

 3.git checkout xxx 回到xxx分支 

4.git rebase main 我在xxx分支上,先把main移过来,然后根据我的commit来修改成新的内容 (中途可能会出现,rebase conflict -----》手动选择保留哪段代码) 

5.git push -f origin xxx 把rebase后并且更新过的代码再push到远端github上 (-f ---》强行)

 6.原项目主人采用pull request 中的 squash and merge 合并所有不同的commit

远端完成更新后

1.git branch -d xxx 删除本地的git分支 
2.git pull origin master 再把远端的最新代码拉至本地

git reset

用于重置当前分支的指针到指定的提交,同时可以选择是否修改工作区和暂存区。它的主要用途包括撤销提交、取消暂存文件、回滚更改等。

1. git reset 的基本语法
git reset [<模式>] [<提交>]
  • <模式>:决定 git reset 的行为,包括 --soft--mixed(默认)、--hard
  • <提交>:目标提交的哈希值、分支名或标签名。如果省略,默认为 HEAD
2. git reset 的三种模式
模式 1:--soft(软重置)
  • 作用:只移动分支指针,不修改暂存区和工作区。

  • 适用场景:撤销提交但保留更改,以便重新提交。

  • 示例

bash git reset --soft HEAD~1

  • 将分支指针回退到上一个提交,但保留暂存区和工作区的更改。
模式 2:--mixed(混合重置,默认模式)
  • 作用:移动分支指针,并重置暂存区,但不修改工作区。

  • 适用场景:取消暂存文件,但保留工作区的更改。

  • 示例

bash git reset --mixed HEAD~1

  • 将分支指针回退到上一个提交,并取消暂存区的更改,但工作区的文件保持不变。
模式 3:--hard(硬重置)
  • 作用:移动分支指针,并重置暂存区和工作区。

  • 适用场景:彻底回滚到某个提交,丢弃所有更改。

  • 示例

bash git reset --hard HEAD~1

  • 将分支指针回退到上一个提交,并丢弃暂存区和工作区的所有更改。
3、常见使用场景
场景 1:撤销最后一次提交
  • 如果你想撤销最后一次提交但保留更改:

bash git reset --soft HEAD~1

  • 如果你想撤销最后一次提交并取消暂存:

bash git reset --mixed HEAD~1

  • 如果你想彻底撤销最后一次提交并丢弃所有更改:

bash git reset --hard HEAD~1

场景 2:取消暂存文件
  • 如果你不小心将文件添加到暂存区,可以使用以下命令取消暂存:

bash git reset <file>

或者取消所有暂存文件:

bash git reset

场景 3:回滚到某个提交
  • 如果你想回滚到某个特定的提交(例如提交哈希为 1a2b3c4):

bash git reset --hard 1a2b3c4

  • 注意:这会丢弃当前分支的所有后续提交和更改。
场景 4:修复提交历史
  • 如果你想将分支指针移动到某个提交,但保留工作区的更改以便重新提交:

bash git reset --soft <commit>

4. 注意事项
  • 数据丢失风险git reset --hard 会丢弃工作区和暂存区的所有更改,且不可恢复。使用时务必谨慎。
  • 远程仓库的影响:如果已经将提交推送到远程仓库,使用 git reset 后需要强制推送(git push --force),但这可能会影响其他开发者的工作。
  • 恢复误操作:如果误操作导致数据丢失,可以使用 git reflog 查看操作历史并恢复。
5. git resetgit revert 的区别
  • git reset:移动分支指针,修改提交历史。
  • git revert:创建一个新的提交来撤销之前的更改,不会修改提交历史。
6. 示例
示例 1:撤销最后一次提交
  1. 查看提交历史:

bash git log --oneline

输出:

abc1234 (HEAD -> main) Update feature def5678 Initial commit

  1. 撤销最后一次提交但保留更改:

bash git reset --soft HEAD~1

  1. 查看状态:

bash git status

bash Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: file.txt

###### 示例 2:彻底回滚到某个提交

  1. 查看提交历史:

bash git log --oneline

bash abc1234 (HEAD -> main) Update feature def5678 Initial commit

  1. 彻底回滚到 def5678

bash git reset --hard def5678

  1. 查看状态:

bash git status

bash On branch main nothing to commit, working tree clean

gitignore

有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等

在主目录下建立".gitignore"文件,此文件有如下规则:

  1. 忽略文件中的空行或以井号(#)开始的行将会被忽略。
  2. 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
  3. 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
  4. 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
  5. 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
#为注释
*.txt        #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt     #但lib.txt除外
/temp        #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/       #忽略build/目录下的所有文件
doc/*.txt    #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

Questions

From http://14.103.161.211:3000/xiaogang/xiaogang
 * branch            master     -> FETCH_HEAD
Updating 9388ecf..23e2ef8
error: Your local changes to the following files would be overwritten by merge:
        app/main/views.py
        app/util/tasks.py
Please commit your changes or stash them before you merge.
Aborting

这个错误信息表示尝试从远程仓库(http://14.103.161.211:3000/xiaogang/xiaogang)拉取更新,但本地的修改会被覆盖,导致合并(merge)操作被中止。

错误原因

本地修改了以下文件:

app/main/views.py app/util/tasks.py 而远程仓库的新版本(23e2ef8)会覆盖你的本地更改,Git 为了保护修改,拒绝自动合并。

解决方法

方案 1:提交你的本地修改(推荐)

如果你希望保留这些修改,并合并远程更新:

git add app/main/views.py app/util/tasks.py  # 添加修改到暂存区
git commit -m "提交本地修改"  # 提交到本地仓库
git pull  # 拉取远程更新并合并

方案 2:暂存修改(临时保存,稍后恢复)

想先拉取远程代码,稍后再处理本地修改:

git stash  # 暂存本地修改
git pull   # 拉取远程更新
git stash pop  # 恢复暂存的修改(可能会有冲突需要手动解决)

方案 3:丢弃本地修改(谨慎使用)

确定不需要这些本地修改,可以直接覆盖:

git reset --hard  # 丢弃所有未提交的修改
git pull         # 拉取远程最新代码

⚠️ 警告:这个操作会永久删除你的本地修改