版本控制
-
git管理文件夹
-
进入要管理的文件夹 --- 进入
-
初始化(提名) git init
-
管理文件夹
-
生成版本
-
.git ---- git在管理文件夹时,版本控制的信息
-
生成版本
git status 检测当前文件夹下的文件状态 (检测,检测之后就要管理了)-------当执行时,什么都没有,说明当前文件夹所有的文件都被管理起来了,生成一个版本
git add index.html(我要管谁)
git add . 当前没有被管理的文件全部管理
个人信息配置----一次即可
git config --global user.email "email"
git config --global user.name "name"
git config --glocal --list
git commit -m "描述信息(版本)" --------(跳到另一个状态,生成一个版本)----------失败可能是因为没有个人信息配置
修改文件
git status ------------ modified: 我在上一个版本的基础上修改了一个状态 (modify -- 修改)
//相当于有新的文件(在生成文本)
git add . 或者 文件名
git commit
查看版本记录
git log
新增文件
添加文件
touch wenjian
mkdir
(Make Directory)- 功能:用于创建新的目录(文件夹)。
- 语法格式 :
mkdir [选项] 目录名
。例如,要创建一个名为test
的目录,在终端中输入mkdir test
即可。如果要创建多级目录(父目录不存在时一并创建),可以使用-p
选项,如mkdir -p parent/child
会创建parent
目录及其子目录child
。
cd
(Change Directory)- 功能:用于切换当前工作目录。
- 语法格式 :
cd [目录路径]
。例如,要切换到名为documents
的目录,假设该目录在当前路径下,可输入cd documents
。若要返回上一级目录,使用cd..
。输入cd
不加任何参数,会切换到用户的主目录。例如,在 Linux 系统中,普通用户执行cd
会回到/home/用户名
目录。
pwd
(Print Working Directory)- 功能:用于显示当前工作目录的完整路径。
- 语法格式 :
pwd [选项]
。通常直接使用pwd
命令,它会输出当前所在目录的绝对路径。例如,当你在/home/user/Documents
目录下执行pwd
,会输出/home/user/Documents
。
bash
ls [选项] [目录]
如果不指定目录,ls
会列出当前工作目录的内容。如果指定了目录,ls
会列出该目录的内容。
创建目录
mkdir 目录名称
pwd 作用是打印当前工作目录的完整路径。使用 pwd 命令可以帮助你确认当前所在的目录是否为目标仓库目录
ls ls 是 "list" 的缩写,用于列出当前目录下的文件和文件夹
当你进入一个可能是目标仓库的目录后,使用 ls 命令可以查看该目录下的内容,以此来确认是否为目标仓库。因为 Git 仓库通常包含一个隐藏的 .git 文件夹,你可以通过 ls 命令查看是否存在该文件夹来判断
回滚
git reset --hard 版本号 在git log 里面的commit(不需要加引号)
git checkout -- 文件名
查看文件内容
cat 文件(加后缀) 命令直接查看某个文件的内容
从远程仓库下载文件
克隆分支时,只会显示主枝(但其实分支也有 ,可以直接git checkout branch(分支名))
git clone 和git pull有什么区别
-
git clone
-
git clone
用于将远程仓库完整地复制到本地。当你需要获取一个全新的项目副本,或者想要在本地开始对一个已存在于远程的项目进行开发时,就会使用这个命令。它会创建一个新的本地仓库,包含远程仓库的所有文件、提交历史、分支信息等。 -
例如,你想要将 GitHub 上的一个项目复制到本地,可以使用以下命令:
git clone 远程仓库网址------------内部已经实现 git remote add origin 远程仓库地址
-
-
git pull
用于从远程仓库获取最新的提交,并将其合并到本地当前分支。当你已经在本地克隆了一个远程仓库,并且想要更新本地仓库的内容以与远程仓库保持同步时,就会使用这个命令。它实际上是git fetch
和git merge
两个命令的组合。- 例如,你已经克隆了一个项目到本地,并且在一段时间后想要获取远程仓库的最新更新,可以在本地仓库目录下执行以下命令:
bash
git pull origin main
git pull origin dev
只会更新本地 dev
分支的内容,不会影响其他分支。
git clone
用于获取全新的远程仓库副本,而 git pull
用于更新本地已有仓库的内容,使本地分支与远程分支保持同步。
若要再回滚回来
git reflog
git reset --hard 版本号
列出分支/查看分支
git branch
创建分枝
git branch 分支名
创建的分支修改名字
git branch -m oldname newname
如何删除远程连接
git remote rm orign(远程仓库的代称)
推送分支
git push -u origin(远程仓库的代称) 分支名称
切换到分支
(回去也使用这个命令,但是回去的时候,相当于回到了之前的状态-----在分支上的修改,回去之后是没有的)
git checkout 分支名
将分支合并
git checkout master(你要合并到哪个分支上)
git merge bug(你要合并哪个分支)
合并时出现的bug
Merge branch 'bug' to fix critical bugs in the system.
2. 保存并退出编辑器
若使用 vim 编辑器:
按 Esc 键退出插入模式。
输入 :wq 并回车,这会保存你输入的提交信息并退出编辑器,Git 会完成合并提交。
合并之后,应该把不必要的分支删除
git branch -d bug(你要删除的分支)
冲突解决--------------手动解决
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
意味着在合并分支时,Git 无法自动处理某些更改,从而产生了冲突。具体到这个例子中,冲突发生在 index.html
文件里。
- 同一文件的同一部分被不同分支修改 :比如,在主分支和
bug
分支里,都对index.html
文件的同一行或者相邻行进行了修改。当你尝试合并这两个分支时,Git 就不知道该采用哪个更改,于是产生冲突。 - 文件被删除和修改 :一个分支删除了
index.html
文件,而另一个分支却对该文件进行了修改,这种情况下合并也会产生冲突。
冲突解决办法
要解决合并冲突,你需要手动编辑有冲突的文件,然后标记冲突已解决并提交更改。下面是具体步骤:
1. 识别冲突文件
Git 会在控制台提示哪些文件存在冲突,像这里提示 index.html
有冲突。你可以使用以下命令查看所有冲突文件:
bash
git status
这个命令会列出所有包含冲突的文件,这些文件通常处于 "unmerged" 状态。
2. 编辑冲突文件
打开 index.html
文件,你会看到类似下面的冲突标记:
html
<<<<<<< HEAD
<!-- 这是当前分支(如主分支)的内容 -->
<div class="old-style">Old content</div>
=======
<!-- 这是要合并进来的分支(如 bug 分支)的内容 -->
<div class="new-style">New content</div>
>>>>>>> bug
<<<<<<< HEAD
表示当前分支的内容开始。=======
是分隔线。>>>>>>> bug
表示要合并的bug
分支的内容结束。
你需要手动决定保留哪些内容,删除冲突标记。例如,如果你想保留 bug
分支的更改,可以将文件修改为:
html
<div class="new-style">New content</div>
3. 标记冲突已解决
编辑完冲突文件后,使用以下命令将修改后的文件添加到暂存区,标记冲突已解决:
bash
git add index.html
4. 提交合并结果
所有冲突都解决并添加到暂存区后,使用以下命令提交合并结果:
bash
git commit
这时候可能会打开编辑器让你输入合并提交信息,输入合适的信息(如 "Resolve merge conflicts in index.html")后保存并退出编辑器,合并操作就完成了。
vim a1.py(打开编辑器)
删除最后一次提交
如果你只是想删除最后一次提交,让仓库状态回退到上一次提交的状态,可以使用 git reset
命令。
bash
git reset --hard HEAD~1
--hard
选项表示不仅将 HEAD 指针移动到指定的提交,还会将工作目录和暂存区的内容也重置为该提交的状态。HEAD~1
表示上一次提交,HEAD
指向当前所在的提交,~1
表示向上移动一个提交。
执行该命令后,最后一次提交将被删除,工作目录和暂存区的内容也会恢复到上一次提交时的状态。需要注意的是,这种方式会永久删除最后一次提交,如果你之后又想恢复这次提交,操作会比较复杂。
情况二:删除中间的某次提交
如果你想删除中间的某次提交,可以使用 git rebase
命令结合交互模式来实现。假设你要删除的提交哈希值为 abc123
,可以按照以下步骤操作:
- 找出要删除提交的前一个提交的哈希值。可以使用
git log
命令查看提交历史,找到该提交的前一个提交的哈希值,假设为def456
。 - 进入交互式变基模式:
bash
git rebase -i def456
执行该命令后,会打开一个文本编辑器,显示从 def456
之后的所有提交记录。找到你要删除的提交记录,将其前面的 pick
改为 drop
,然后保存并关闭编辑器。
\3. Git 会按照修改后的提交顺序进行变基操作,将指定的提交删除。如果在变基过程中出现冲突,需要手动解决冲突,然后使用 git rebase --continue
继续变基操作。
情况三:删除远程仓库的提交
如果你已经将本地的提交推送到了远程仓库,要删除这些提交需要先在本地仓库进行上述操作,然后使用 git push -f
强制推送到远程仓库:
bash
git push -f origin <branch-name>
其中,origin
是远程仓库的名称,<branch-name>
是你要推送的分支名称。需要注意的是,强制推送会覆盖远程仓库的提交历史,可能会影响其他开发者的工作,因此在团队协作中使用时要谨慎,最好提前和团队成员沟通。
-
- 如果你在 Windows 系统上工作,希望文件使用 CRLF 换行符,可以执行:
bash
git config --global core.autocrlf true
- 如果你在 Unix/Linux 或 macOS 系统上工作,希望文件使用 LF 换行符,可执行:
bash
git config --global core.autocrlf input
- 若你不希望进行任何换行符转换,可设置为:
bash
git config --global core.autocrlf false
退出
esc :wq
补充
git pull origin dev
等同于
git fetch origin dev
dit merge origin/dev
stash git stash可以将当前已经修改的文件暂存起来,将文件恢复到修改前的状态。同时可以在适合的时候还可以将进度还原。
# 把所有修改未提交的文件放入暂存区
git stash
# 把所有修改未提交的文件放入暂存区,并添加注释
git stash save 'message'
# 查看所有缓存区进度列表
git stash list
# 释放暂存区最新一个stash
git stash pop
# 恢复指定进度到工作区,这里的id是通过上面list命令得来的
git stash pop [id]
# 删除进度,不指定ID的话,默认删除最新的进度
git stash drop [id]
# 清空
git stash clear
tag
tag 是git仓库里面某分支某次commit 的标记 。本质上还是commit 的一个别名。
查看 本地 所有tag
git tag or git tag -l
查看 仓库 所有tag
git ls-remote --tags origin
创建 本地 tag
git tag -a <标签名> -m '标签内容文字描述'
创建 仓库 tag
将本地tag推送到仓库,就成了仓库tag
git push origin <标签名>
如果本地tag比较多,一次全部推送
git push origin --tags
删除本地tag
git tag -d <标签名>
进阶用法,为某个commit后的代码打tag标签
查看当前分支的提交历史 里面包含 commit id
git log --pretty=oneline
git tag -a <标签名>
or
git tag -a <标签名> <commitId> -m '标签内容文字描述'
作者:防己_DoLi
链接:https://juejin.cn/post/7165818788695408676
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
删除仓库tag
git push origin :refs/tags/<标签名>
将代码切换到某个标签
git checkout -b <tagName>
diff
git diff 命令,默认查看的就是 工作区 和 暂存区之间文件的差异
1.git diff : 查看工作区和暂存区之间所有的文件差异
2.git diff -- 文件名:查看具体某个文件 在工作区和暂存区之间的差异
3.git diff -- 文件名1 文件名2 文件名3:查看多个文件在工作区和暂存区之间的差异
修改内容
echo "添加内容" >> a.txt
将工作区中修改的文件添加到暂存区后再比较差异情况
git diff HEAD : 查看工作区与最新版本库之间的所有的文件差异
git diff 具体某个版本 : 查看工作区与具体某个提交版本之间的所有的文件差异
git diff HEAD -- 文件名 : 查看工作区与最新版本库之间的 指定文件名的文件差异
git diff HEAD -- 文件名1 文件名2 文件名3 :查看工作区与最新版本库之间的 指定文件名的多个文件差异
git diff 具体某个版本 -- 文件名 : 查看工作区与具体某个版本之间的 指定文件名的文件差异
git diff 具体某个版本 -- 文件名1 文件名2 文件名3 :查看工作区与最具体某个版本之间的 指定文件名的多个文件差异
git diff 版本号1 版本号2 --stat : 查看两个版本之间的改动的文件列表
git diff 版本号1 版本号2 src : 查看两个版本之间的文件夹 src 的差异
# 查看reflog git reflog # 找到丢失提交的哈希值 git reset --hard
使用 git reflog
来找回之前的状态。通过查看引用日志,我们可以找到被删除的分支或者之前的提交,并重新创建分支或者将 HEAD
恢复到正确的状态。
总结
git init ----初始化
git status ----------管理目录下的文件状态 (新增和修改过的都是红色)
git add . 或者文件名 -----------管理指定文件(红变绿)
git config --global user.name "name"
git config --global user.email "email"------------个人信息配置
git commit -m "描述信息"------生成版本
git log ------查看版本记录
git reset --hard 目标版本号-----回滚(它之前的版本没有了)
git branch -----查看分支
git branch 分支名称 -----切换分支
git checkout 分支名称--------切换分支
git merge 要合并的分支 --------分支合并
git branch -d 分支名称 ----------删除分支
git remote add origin 远程仓库地址------给远程仓库起别名
git push -u origin 分支 ---------向远程推送代码
git clone 远程仓库地址 -------克隆远程仓库代码
git pull origin dev -----拉代码
git push -f 强推
包图
类图
用例图
git reset --hard HEAD~1 回到上一个版本
soft
只移动 HEAD
指针,暂存区和工作目录的内容都不会改变
远程仓库没有f3--被删除了
但是 git status --- 还有绿色的 f3 -------说明还在暂存区
soft影响版本库,不影响工作区和暂存区
mixed
移动 HEAD
指针,同时重置暂存区,让暂存区的状态和指定提交版本一致,但工作目录里文件的内容不会改变。
mixed影响版本库、暂存区,不影响工作区
hard
不仅移动 HEAD
指针,还会重置暂存区和工作目录,让它们的状态都和指定提交版本完全一致
这意味着工作目录里的文件会被直接替换为指定版本时的内容,未提交的修改都会丢失,回到指定提交时的状态。
git status --------什么都没有------说明不在暂存区
hard影响版本库、工作区和暂存区
git clone 远程仓库地址 -------克隆远程仓库代码
git pull origin dev -----拉代码
git push -f 强推
包图
类图
用例图
git reset --hard HEAD~1 回到上一个版本
soft
只移动 HEAD
指针,暂存区和工作目录的内容都不会改变
远程仓库没有f3--被删除了
但是 git status --- 还有绿色的 f3 -------说明还在暂存区
soft影响版本库,不影响工作区和暂存区
mixed
移动 HEAD
指针,同时重置暂存区,让暂存区的状态和指定提交版本一致,但工作目录里文件的内容不会改变。
mixed影响版本库、暂存区,不影响工作区
hard
不仅移动 HEAD
指针,还会重置暂存区和工作目录,让它们的状态都和指定提交版本完全一致
这意味着工作目录里的文件会被直接替换为指定版本时的内容,未提交的修改都会丢失,回到指定提交时的状态。
git status --------什么都没有------说明不在暂存区
hard影响版本库、工作区和暂存区