一、安装 具体查看 安装Git
二、使用
基础知识
- 工作区(Workspace):就是你在电脑里能看到的项目目录。
- 暂存区(Index / Stage):临时存放更改的地方,使用命令"git add <.|file>"就是把文件加入暂存区。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库(Repository):管理版本的文件,使用"git commit -m 'description'"就是把暂存区的文件提交到版本库。工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
- 远程仓库(Remote):托管代码的服务器。可以简单的认为是你项目组中的一台电脑用于远程数据交换
文章图片
origin:远程仓库库默认别名
master:仓库默认分支的名称
本地项目初始化/和远程仓库操作
git init,把当前文件夹初始化位git工程
git remote add [
git remote -v 查看远程仓库地址
git push <远程主机名> <本地分支名><远程分支名>,比如 git push origin dev dev
git push -u origin master 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push
基本操作:添加/提交/查看记录
"git add ."或者"git add
git commit -m "description",将暂存区的所有文件提交到版本库
git commit --amend -m "xxxx",修改上一次的提交信息
git show
git status,查看当前工作区和暂存区的文件状态
git diff,查看当前工作区对比暂存区的更改
git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别
“git log”或"git log
git log --graph命令可以看到分支合并图。
git log --pretty=oneline --graph --abbrev-commit展示效果如下
文章图片
git cherry-pick
若要合并某个分支上的一系列提交,这种情况就cherry-pick就不适用了。
需要使用rebase指令进行合并操作
具体操作步骤:
// 以**最后一次提交**为节点, 创建一个新的分支
1. git checkout -b newbranch 最后一次提交的id
// 再 rebase 这个新分支的commit到目标分支上<--onto 目标分支>。 指明你想从哪个特定的commit开始。
2. git rebase --onto 目标分支 start_id
仓库分支管理
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
比如git checkout -b dev,切换并创建dev分支,相当于
$ git branch dev
$ git checkout dev
合并某分支到当前分支:git merge
正常合并如果能用fast-forward就会使用, 但这种模式下,删除分支后,会丢掉分支信息。可以使用--no-ff强制禁用ff模式
git merge --no-ff -m "merge with no-ff" dev
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
删除分支:git branch -d
代码回退
看上面的几个区域的图基本就能明白
"git reset HEAD" 或者"git reset HEAD
git reset --hard HEAD^/git reset --hard 1094a,强制回退上一个版本/回退到指定版本号的版本,版本库会直接回退(远程仓库不会回退),需要特别谨慎。版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了
"git rm --cached
"git checkout ." 或者 "git checkout --
"git checkout HEAD ." 或者 "git checkout HEAD
“git revert HEAD/git revert commitID”: 放弃已经push的指定版本的修改,会新增一条记录,版本会递增
"git reflog" , 用来查看你的每一条命令,用来配合上面的命令恢复你的误操作
例1:将单个文件(a.js)回退到某一版本
- gitlog a.js查看a.js的更改记录
- git resetfcd2093a.js 先将暂存区中的该文件回退到历史版本fcd2093
- git checkout -- a.js 暂存区中该文件的历史版本(fcd2093)覆盖工作区中对应的文件,此时(工作区、暂存区的文件a.js是fcd2093版本)。
【注】2、3步可以合并成一步git checkout fcd2093 a.js
此时,如果git commit 提交暂存区的数据到版本库,则会重新生成一条记录
例2:将整个项目(远程仓库和本地仓库当前版本一致)回退到某个版本,并push到远程仓库,让远程仓库也回退。
例如,版本库最新的几条提交记录是:aaaa -> bbbb -> cccc;cccc是最新的提交记录,要回退到aaaa并push
- git reset --hard aaaa 强制将版本库回退到aaaa,但是远程仓库还是cccc
- git reset cccc 将head移到最新的版本(和远程的head保持一致,实际就是将远程暂存区的内容更新到最新版本cccc,工作区的内容还是保持在aaaa),此时aaaa和cccc的差异便作为本次更改的内容。
- git add / git commit / git push 提交后生成新的版本号dddd
【注】也可以使用git revert cccc 和 git revert bbbb来实现,不过会新增两条回滚记录
保留半成品现场(存储临时现场)
主要用在目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容
git stash 存储临时现场
git stash list 查看工作临时现场
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
git stash apply stash@{0}
子模块
有时工程太过庞大想要分出子工程单独管理,或者纳入一个子工程到当前工程来,就可能用到子模块功能。
git子模块配置处理(即git的B仓库被作为A仓库的子目录),两个仓库可以各自管理和提交
git submodule add
git status:在A中查看发现多了
git diff --cached
例如,子模块B的名称为subproject_demo:
文章图片
git commit -m 'first commit with submodule xxx': 结果中注意 subproject_demo条目的 160000 模式。这在Git中是一个特殊模式,基本意思是你将一个提交记录为一个目录项而不是子目录或者文件。
当你使用clone克隆该项目(父工程A)时,会发现子模块的文件夹内容为空,需要做:
git submodule init: 初始化你的本地配置文件
git submodule update:从子模块B拉取所有数据并检出你上层项目里所列的合适的提交(保持子模块是最新的那个)
进入子模块,发现子模块是那个项目的 你先前提交的确切状态的分支
chen_@DESKTOP-TJKEMKG MINGW64 /c/works/demo/subproject_demo((aa1eeb0...)) // 发现没:aa1eeb0就是之前的哪个提交
chen_@DESKTOP-TJKEMKG MINGW64 /c/works/demo/subproject_demo((aa1eeb0...))
// 发现没:aa1eeb0就是之前的哪个提交
如果你在项目中改了子模块的代码,准备提交到对应的分支(add和commit已经执行过),使用:
git push origin HEAD:
如果其他人有修改这个子模块并提交到A工程,你可以重新pull A项目分支,然后执行git submodule update保证子模块也是最新的
git clone --recurse-submodules
【注】使用时要注意,最好保证在父工程A中来自B的提交永远来自同一个B的分支,比如master分支。所以B的分支代码更改完毕并测试完毕合并到master后,再在A提交来自B的master分支的提交
【注】引入私有git工程还可以又其他方式,比如和npm配合:《2018 年了,你还是只会 npm install 吗》查看“私有 git 共享 package”部分
https和ssh使用
查看链接:https://blog.csdn.net/qq_42108192/article/details/90168968
https模式下添加git账号到项目,push不用每次输入账号密码
打开.git文件的下的 vim .git/config新增以下内容
[user]
name = XXXX05@qq.com
email = XXXX05@qq.com
[credential]
helper=store
三、踩坑 [remote rejected](hook declined)
完整日志:
文章图片
百度查看帮助,找到类似的问题:https://blog.csdn.net/weixin_39278265/article/details/102248258
本人的问题解决办法
git config --global --unset branch.web2.0.merge
然后再push就OK。
本文作者:chua1989
【互联网|Git基础常用功能】原文链接:https://www.cnblogs.com/chuaWeb/p/git_all.html
推荐阅读
- Linux|Git踩坑集锦(小白作者在工作场景使用git的总结)
- #|git使用踩坑总结
- 开发者必备!你真的懂Git吗(你知道Git的运行进制吗?)
- 精通Git开发!Git核心功能使用详解
- Github新手快速入门,github和git的基本使用教程
- kubebuilder 实战之开发一个存储用户信息的 operator
- 【Github教程】史上最全github使用方法(github入门到精通)
- Python|知乎热议程序员「35岁定律」,30岁转行学Python是否可行()
- Layotto v0.4.0-rc 发布