repo等其他内容后续更新
git 的几个分区
- 工作区:就是你在电脑里能看到的目录(代码编辑区)
- 缓存区:一般存放于 “.git” 目录下的 index 文件中(过渡层,避免误操作)
- 版本库:工作区有一个隐藏目录 .git(本地仓库,专门控制版本)
- 远程仓库:如 GitHub 上的库
git 的基本操作
参考:https://www.runoob.com/git/git-tutorial.html
-
初始化(本地新建 git 仓库)
git init # 此命令可以在当前目录下创建一个空的本地仓库(版本库),出现.git文件夹
完整案例:
使用 git init 后无需再 git clone,git clone 包含了 git init,git clone 是与远程仓库构建连接的最直接的命令
git init git remote add <shortname> <git_url> # 如果远程仓库非空则拉取最新代码 git pull origin master # 远程仓库为空可以本地推送 # 前两个命令可以在未建立连接时就使用 git add . git commit -m "info" git push origin master
-
连接
git remote add <shortname> <git_url> # 此命令可以建立与远程仓库的连接 git remote remove <shortname> # 此命令可以删除与远程仓库的连接 git remote -v # 此命令可以查看与远程仓库的连接
关于 git remote add:
- 将远程仓库唯一的 URL 映射成为 在本地仓库中对远程仓库起的别名 ,只负责映射,不会下载
- 别名 只在本地仓库使用,常用 origin,远程仓库的名字是一个绝对唯一的URL
-
克隆
# 在当前目录下直接克隆出项目文件夹,.git在文件夹内 # 可以设置参数--recursive表示递归,会克隆当前项目与其中子项目的代码 git clone <git_url>
-
拉取
- git fetch:从远程仓库中拉取最新版本代码到本地,不会自动 merge
# 会拉取远程分支的状态并更新到本地分支,但不会合并,本地分支没有则创建 # 该命令也不会切换本地的分支状态为指定的本地分支 git fetch <shortname> <远程分支>:<本地分支>
完整案例:
git fetch origin master:dev git checkout dev git merge origin/master
- git pull:从远程仓库中拉取最新版本代码到本地码,并自动 merge,相当于:git fetch 和 git merge 两步操作
git pull <shortname> <远程分支>:<本地分支> # 会合并到指定的本地分支
-
提交
-u
或--set-upstream
用于将本地分支与远程分支建立追踪关系,使得后续可以在使用git pull
和git push
时不必每次都指定远程分支和远程仓库# 将工作区文件添加到缓存区 git add <文件1 文件2 ...> # 将缓存区文件添加到版本区,或者将工作区文件直接添加到版本区 git commit <文件1 文件2 ...> -m "注释" # 如果使用了git add,可以不用再加具体的文件 # 将版本库文件推送到远程仓库 git push # 添加-f参数表示强制推送(不推荐) git push <shortname> <分支> # 无需评审即可合并 git push <shortname> HEAD:refs/heads/<分支> # 无需评审即可合并 git push <shortname> HEAD:refs/for/<分支> # 提交至gerrit仓库,需要经过评审才能合并远程仓库
-
查看
git status # 查看提交的状态,查看是否有修改 git diff # 尚未缓存的改动——具体修改的内容 # 拓展 git status -s/--short # 状态简览 git diff #工作区和暂存区比较 git diff --cached # 工作目录与上次提交时之间的所有差别,这条命令所显示的内容在不带"-a"参数运行 "git commit"命令时就会被提交 git diff HEAD # 工作目录与上次提交时之间的所有差别,这条命令所显示的内容都会在执行"git commit -a"命令时被提交。 git diff --word-diff # 使用逐词比较,默认是逐行比较 git diff <分支名> # 查看当前的工作目录与另外一个分支的差别 git diff <分支1>..<分支2> # 比较项目中任意两个分支的差异。如果你想找出 <分支1> 和 <分支2> 的共有父分支和 <分支2> 之间的差异,你用3个‘.'来取代前面的两个'.' 。对比后的结果解读为:“<分支2>比<分支1>增加或删除了xxx。” git diff HEAD -- ./lib # 在当前分支下,你当前工作目录下的lib目录与上次提交之间的差别
-
删除 / 重命名
执行完下面的命令后,正常提交即可对应修改仓库里文件的状态
git rm filename # 删除工作区和缓存区的文件 git rm --cached filename # 删除缓存区中文件使其不被git跟踪,但保留工作区的文件 git mv oldname newname # 修改工作区文件名称
-
撤销恢复
谨慎使用,因为它们都可能会丢弃工作目录中的未提交更改
(1) git checkout 撤销未 add 时的代码
- 此命令不会删除掉刚新建的文件(尚未 git add),因为刚新建的文件还没有加入到 git 的管理系统中,对于 git 来讲是未知的
- 只影响工作区的修改,不会影响暂存区的修改
- 不可逆操作,除非https://www.cnblogs.com/zndxall/p/9549878.html
# 维持HEAD的指向不变,用暂存区的 “所有文件” 直接覆盖 “工作区文件”,即恢复到最后一次提交的状态 git checkout . # 维持HEAD的指向不变,用 “某个分支的文件” 替换暂存区和工作区中相应的文件 git checkout branch --<filename> # 将HEAD指向的版本库文件,同时替换暂存区和工作区文件 git checkout HEAD <filename> 或 git checkout HEAD .
(2)git reset 撤销已经 add 或 commit 但未 push 的代码
若已经 push 到远程仓库,在使用 reset 进行版本回退后直接 push 是失败的,因为本地版本号于远程仓库的版本号不一致(本地版本号落后于远程仓库的版本后),此时不要 pull,否则代码又还原了,得重新 reset。只需在 push 时加上命令:
--force
(⚠️ 这很可能会删除别人提交的代码,所以最好确保别人没有提交,或者与别人沟通好此操作的必要性以及修复措施,总之这是个危险的操作,慎用)git reset HEAD 文件名 # 删除暂存区中的指定文件 git reset HEAD . # 放弃暂存区内所有的内容 git reset --hard <版本号> # 放弃本地修改,强制回退到某个版本。 git reset --hard origin/<分支> # 放弃本地修改,强制保持与远程分支一致 git reset --hard HEAD^ 或 git reset --hard HEAD~1 # 撤销上1次的commit,不保留本地修改 git reset --hard HEAD~2: # 撤销之前2次的commit,不保留本地修改 git reset --soft <版本号> # 保留本地修改至暂存区,版本库强制回退到某个版本 git reset --soft origin/<分支> # 保留本地修改至暂存区,版本库强制保持与远程分支一致 git reset --soft HEAD^ 或 git reset --soft HEAD~1 # 撤销上1次的commit,保留本地修改至暂存区 git reset --soft HEAD~2: # 撤销之前2次的commit,保留本地修改至暂存区
(3)git revert 撤销已经 push 的代码
# 回退到指定的历史版本提交的更改,不自动提交(删掉该版本号及其之前的所有已push的更改,等待提交)。这样就把该版本的记录删除了 git revert -n <版本号> # 回退到HEAD中倒数第n次提交的更改,不自动提交(删掉这n次已push的更改,等待提交) # n:代表该提交记录的次数 # n - 1:恢复HEAD中某个版本提交的代码时,要指定HEAD到该版本的前一个版本 git revert -n HEAD~<n-1> # 该选项表示:仅仅恢复工作树和索引,修改后不自动提交,最后一起手动提交 # revert命令默认会对每一步的commit进行一次提交,-n后可以最后一起手动提交 -n (--no-commit)
-
日志
git log # 查看所有提交过的版本信息。(按 q 或 ctrl + z 均可退出) git log --pretty=oneline # 查看完整 hash 版本号和 commit 信息 git log --graph --pretty=oneline --abbrev-commit: # 查看简短 hash 版本号和 commit 信息 # 查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作),内容由 hash 版本号、HEAD 记号 和 commit 信息 组成。(按 q 或 ctrl + z 均可退出) git reflog
git 分支操作
-
查看分支
git branch
-
创建分支
git branch <本地分支>
-
切换分支
git checkout <本地分支> # 切换分支(git checkout也可以用来回复工作目录) git checkout -b <本地分支> # 创建并切换分支 git checkout -b <本地分支> <shortname>/<远程分支> # 远程仓库已经创建分支,但本地还未拉取,此时创建并切换分支,同时跟踪远程分支
-
删除分支
git branch -D <分支名>
-
合并分支
git merge <分支名> # 将指定分支的最新提交和更改合并到当前分支
-
比较本地分支与远程分支
git diff <本地分支名> <shortname>/<远程分支名>
-
保存和恢复工作进度
-
git stash 命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容(stash 中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上)
-
git stash 作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中
-
在未 add 之前才能执行 stash
-
git stash 应用场景:
(1)当正在 dev 分支上开发某个项目,这时项目中出现一个 bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到 hotfix 分支进行bug 修复,修复完成后,再次切回到 dev 分支,从堆栈中恢复刚刚保存的内容
(2)由于疏忽,本应该在 dev 分支开发的内容,却在 master 上进行了开发,需要重新切回到 dev 分支上进行开发,可以用 git stash 将内容保存至堆栈中,切回到 dev 分支后,再次恢复内容即可
git stash # 能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录,可跨分支 git stash save <message> # 作用等同于git stash,区别是可以加一些注释 git stash list # 查看当前stash中的内容 git stash drop <名称> # 从堆栈中移除某个指定的 stash git stash clear # 清除堆栈中的所有内容 git stash show # 查看堆栈中最新保存的 stash 和当前目录的差异 # 只能恢复一次。将当前stash中的指定内容恢复,并应用到当前分支对应的工作目录上 # stash@{num}是可选项,不带此项则默认恢复最近的一次进度,相当于git stash pop stash@{0} # 该命令会将堆栈中最近保存的内容删除,所以只能恢复一次 git stash pop stash@{num} # 可恢复多次。将堆栈中的内容应用到当前目录,不同于git stash pop,该命令不会将内容从堆栈中删除,也就说该命令能够将堆栈的内容多次应用到工作目录中,适应于多个分支的情况 git stash apply # 从最新的stash创建分支 # 应用场景:当储藏了部分工作,暂时不去理会,继续在当前分支进行开发,后续想将stash中的内容恢复到当前工作目录时,如果是针对同一个文件的修改(即便不是同行数据),那么可能会发生冲突,恢复失败,这里通过创建新的分支来解决。可以用于解决 stash 中的内容和当前目录的内容发生冲突的情景(发生冲突时,需手动解决冲突) git stash branch
-
-
关联远程分支与本地分支
关联后,本地再 pull、push 分支时就不必每次都输入 “origin <远程分支名>” 了
git branch --set-upstream-to= <shortname>/<远程分支名> <本地分支名>
参考链接:
https://blog.csdn.net/mChales_Liu/article/details/104379526