“git”使用的常见问题

如何将Git存储库还原到之前的提交?

我不小心push了有问题的代码,提交代码的时候将不应该上传的代码上传到远程仓库。这个时候git还原就能够很有效的帮助我们解决问题。
如何在提交前撤消'git add'。

小乌龟

Git
Git的作用与安装
作用:

1. 协同开发
2. 版本记录
3. 冲突解决
4. 历史追查
5. 代码备份
6. 版本还原
7. 权限管理
8. 分支管理
9. 代码审查
...
1
2
3
4
5
6
7
8
9
10
安装

1. 命令行工具:git for windows(重点)
https://git-for-windows.github.io/1
tip:
点击安装包,然后傻瓜式的安装就可以成功

2. 可视化工具:TortoiseGit
https://tortoisegit.org

3. github网站(掌握)
http://www.github.com

4. gitee
http://www.gitee.com
1
2
3
4
5
6
7
8
9
10
11
12
13
Linux常用命令
命令    说明    使用方法
touch    创建一个文件    touch test.html
mkdir    创建一个文件夹    mkdir test
ls    查看文件夹下面的文件    ls
clear    清空屏幕    clear
rm    删除命令-rf (强制递归删除)    rm-rf 路径
cat    打印文件内容    `
cd       # 回到家目录
cd .     # 回到当前位置
cd ..    # 前往父级目录
cd ../ect/dir1     # 前往父级目录下的ect下的dir目录
1
2
3
4
Vim基础命令
命令行下的文本编辑器

命令    作用    使用方法
vim    用vim打开一个文件    vim 1.txt
i    insert    i 或者 insert
:q!    非编译下 ,强制退出    
:w!    非编译下,强制保存    
:wq!    非编译下,强制保存并退出    
:x!    非编译下,强制保存并退出    
dd    非编译下,删除一行    
u    非编译下,倒退    
git的使用
Git 全局设置:这个是第一次使用的时候配置,记录开发者的邮箱

git是分布式版本控制工具,所以我们需要填写用户名和邮箱作为一个标志。
C:\Users\lixi19861125路径下.gitconfig文件,这个我文件里面可以看到--global属性,所有的git项目都会公用这个属性
git config --global user.name "用户名称"
git config --global user.email "你的注册gitee 或者 github 的邮箱地址"
# 邮箱与github或者gitlab的注册邮箱保持一致
# 我的 gitee没有设置邮箱,所以这里可以用它默认的这个.如果设置邮箱,那就必须与设置的邮箱一致
1
2
3
4
5
6
注意 :

命令之间有 空格
上面的命令只需要配置一次,如果错误重新输入
可以使用git config -l 命令查看配置信息是否保存成功
创建 git 库

mkdir fileName   # 创建本地仓库
cd fileName         # 进入本地仓库
git init 
touch README.md      # 创建一个描述文件
git add README.md    # 添加这个描述文件
git commit -m "first commit"
git remote add "你的 .git 地址"
git push -u origin "master"
1
2
3
4
5
6
7
8
如果已经有仓库

cd existing_git_repo
git remote add origin "你的 .git 地址"
git push -u origin "master"
1
2
3
Git版本库的三个区域

工作区(代码编辑区)
暂存区(git修改等待提交区域)
云仓库(代码云保存)


修改后提交到gitee中

git.add .  # 将所有的add上
git commit -m "这里面的是记录"
git push --all  # 将所有的push到云端
1
2
3
git 命令
查看文件状态

git status
1
查看文件状态的详细信息

git diff   # 不显示新增的文件,文件被修改了是可以显示的
1
尚未缓存的改动: git diff
查看已缓存的改动: git diff --cached
查看已缓存的与未缓存的所有改动: git diff HEAD
显示摘要而非整个 diff: git diff --stat
将文件/目录添加到临时暂存区

1. git add 文件名/目录名
2. git add .   # 这个是将所有修改的内容全部添加
3. git add -A  # 与 . 一样的 
tip:
以上通过git add命令的文件会提交到暂存区中,但是这里的文件其实没有真正的提交。使用下一个命令才是把他提交到一个统一的版本文件
1
2
3
4
5
提交文件

git commit -m "提交信息"
tip:
每当有文件被修改/添加/删除的时候,都需要重新git add,然后再git commit
1
2
3
把暂存区的内容发送云端

git push -u origin "master"
1
查看日志

git log
git log --online
1
2
版本回滚

git reset --hard HEAD^1

tip:
HEAD是一个指针,永远指向最新版本,^1表示让HEAD指针指向上一个版本

--hard 硬:这种回顾不但将版本回顾,还会将指定的数据抹除。不会保留任何你修改的记录
--soft 软:回退版本,也会保留改动的记录。会自动帮你git add。
--mix 折中:回退版本,并会保留所有改动记录。但是不会自动帮你git add

git reset : 修改HEAD的位置

这种方式可以恢复到之前某个提交的版本,但是恢复之后,当前版本之后的版本将不复存在。
1
2
3
4
5
6
7
8
9
10
11
12
回退多个版本
git reset --hard HEAD~2 #回退到2个版本之前的版本
1
版本的穿越

git reflog # 查看历史记录的版本号

e.g.
$ git reflog
    # 查看所有的操作记录
e.g.
git reset --hard 7c77ab0
1
2
3
4
5
6
7
还原文件

git checkout 文件名

e.g.
vi src/b.txt

git add src/b.txt
git commit -m "update 005"

git checkout src/b.txt
1
2
3
4
5
6
7
8
9
删除文件

1. 用Linux命令先删除文件
2. git add
3. git commit
1
2
3
git rm 从工作目录中手工删除文件

1. 如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f: git rm <file>
2. 仅是从跟踪清单中删除: git rm --cached <file>
1
2
3
4
移动或者重命名一个文件/目录/软连接

git mv
1
查看分支

git branch -v

e.g.
$ git branch -v
* master b94d274 update 006
1
2
3
4
5
创建分支

git branch 分支名称
e.g.
$ git branch common
$ git branch -v
  common b94d274 update 006
* master b94d274 update 006
1
2
3
4
5
6
注意:

有了新的分支之后,需要把新的分支push到云端 git push --setupstream origin

切换分支

git checkout 分支名

e.g.
git checkout common
1
2
3
4
每次切换分支之前

合并分支 (将其他分支合并到主分支 : master)

1. 切换到主分支
git checkout master

2. 合并
git merge 分支名
e.g.

git merge common
1
2
3
4
5
6
7
8
删除分支

git branch -d name
1
其他分支上传后 需要 pull

git pull origin master
1


配置忽略文件
需要忽略的文件不能够push到云端库中的。

自己手动创建一个文件 .gitignore ,在文件中书写规则 ( .gitignore 需要和 .git 同级目录)

使用 ls -a

# 以下这些需要在文件中写
#忽略.idea目录
.idea
# 忽略所有的png图片
*.png
#把/source/imgs整个文件夹给忽略
/source/imgs
#忽略自己
.gitignore
1
2
3
4
5
6
7
8
9
仓库中已经提交了改文件
对于已经加入云仓库的文件,是不能忽略的

对于已经加入到云仓库的文件,可以在版本库当中进行
删除
git rm --cached .gitignore
1
清楚完成以后,在配置文件当中进行忽略
.重新add和commit和push提交
解决分支的合并冲突
为什么会冲突 :

多个分支当中,同一个文件的内容不相同,会产生冲突
在分支合并的时候解决冲突

1. 定位冲突的文件 (含有 both的就是冲突文件)
    $ git status
2. 手动处理处理 将冲突的代码进行筛选和修补
    打开冲突文件
        <<<<<<<<<HEAD  到   ========          # 是master代码
        ========   到  >>>>>>>>>>> 分支名字    # 是分支代码
3. 想要那一段代码就另一端代码,然后保存 
4. 重新 `add` , `commit` 和 `push`
1
2
3
4
5
6
7
8
.git目录


hooks : 客户端的钩子脚本,特定操作下自行执行的
info : 包含全局性排除文件,可以忽略那些文件的(一般不用)
logs : 目录存储了所有的数据内容, 本地版本库的存放位置
refs : 该
config : 该文件包含了配置项目
description : 仓库描述信息
HEAD : 只是目前被检索的分支
index : 暂存区文件,是一个二进制文件
💡 注意 : 不要手动修改 .git 文件夹当中的任何内容
完整的 git 流


GitFlow
GitFlow 是团队开发的一种最佳实践,将代码划分积分部分



Master : 主分支,上面只能保存正式发布的版本
Hotfix : 线上代码Bug修复分支,修复完成以后,需要合并回Master和Develop分支,同时在master上打一个target
Develop : 开发者分支,提交的都是未测试的代码
Feature : 功能分布,给App每增加一个功能,则需要开一个fea分支
Release : 待发布分支,测试分支,修改BUG(把开发代码进行检测的)
常见出错
CRLF
CRLF 是Cariiage-Return-Line-Feed的缩写

CR表示的是ASCII第13 符号位\r回车键
LF表示的是ASCII第10 符号位\n换行符


这个只是一个警告,并不是错误

提交出错


原因 : 两个人(A和B)使用同一个分支,"A"先提交了,远程仓库的
状态发生了改变

B的本地仓库和云仓库不同步,提示需要先获取云仓库内容 (这个一般在 git commit 时就已经出错了)

修改: git pull origin master (这里的 master 是分支名字,你是那个分支可以换成相对应的分支名)

注意:先git pull,让本地仓库同步云仓库,然后再push

第一次提交错误


云端仓库没有分支

解决: git push --set-upstream origin demo

冲突提醒
合并分支容易导致冲突
利用主分支开辟一个新的分支
修改主分支的index.html
修改从分支的index.html
利用主分支合并从分支


注意:先定位冲突,修改冲突文件,在提交

位置错误


当前没有 .git包

可以在 该目录下 git init

安装和写在密码管理工具
安装 :

git credential-manager install
1
卸载:

git credential-manager uninstall
1
注意 : 每次需要验证才是安全模式


git revert回滚版本,或者可视化工具回滚到制定版本

img

可以使用git 回滚功能

git log                    //查看提交历史,找出要回滚到的commit-id
git reset --soft commit-id //回滚到commit-id
git reset --soft HEAD~3    //将最近3次的提交回滚

之前我也碰到一样的问题了,主要是用git reset --soft回滚,回滚后git push可能需要-f参数,具体操作写了篇博客,可以参考这个:
【经验】Git|如何删除错误的commit?(存在大文件无法push的commit、不需要的commit等情况)

通过我们可以结合IDE的git工具来使用 IDE一般叫rollback
而且实际工作使用中,commit和push很可能是一起完成的;push成功了 是没法撤回了 我们应该最短时间内 通过git compare 找到上个版本代码 将上一个版本复制回来 并重新提交

参考链接

望采纳