Git基础常用功能
一、安装
具体查看 安装Git
windows下git bash坑
不能使用上/下键切换选项
参考:https://blog.csdn.net/csdn_yudong/article/details/86613435
推荐直接使用数字代替,从1开始
二、使用
基础知识
- 工作区(Workspace):就是你在电脑里能看到的项目目录。
- 暂存区(Index / Stage):临时存放更改的地方,使用命令"git add <.|file>"就是把文件加入暂存区。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库(Repository):管理版本的文件,使用"git commit -m 'description'"就是把暂存区的文件提交到版本库。工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
- 远程仓库(Remote):托管代码的服务器。可以简单的认为是你项目组中的一台电脑用于远程数据交换
一张图描述git的文件如何在各个区域之前流转:
origin:远程仓库库默认别名
本地项目初始化/和远程仓库操作
git init,把当前文件夹初始化位git工程基本操作:添加/提交/查看记录
git commit --amend -m "xxxx",修改上一次的提交信息
git cherry-pick <commitId>,复制一个特定的提交到当前分支,比如master分支的bug修复提交复制到dev分支
git cherry-pick commitId1..commitId100,复制两个commit之间的提交到当前分支,注意:不包括commitId1
仓库分支管理
例1. git远程分支已经删除,本地还能看到解决办法
当我们删除远程分支后执行git branch -a
本地却依然能看到远程分支
这个时候我们只需要执行git remote prune origin
清理一下就可以了
然后再次执行git branch -a
就看不到啦
代码回退
看上面的几个区域的图基本就能明白
"git reset HEAD" 或者"git reset HEAD <file>"命令,暂存区的目录树或文件会被重写,被 master 分支指向的目录树或文件所替换,但是工作区不受影响。
"git rm --cached <file>" 命令,会直接从暂存区删除文件,工作区则不做出改变。
"git checkout ." 或者 "git checkout -- <file>" 命令,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
"git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
- git log a.js查看a.js的更改记录
- git reset fcd2093 a.js 先将暂存区中的该文件回退到历史版本fcd2093
- git checkout -- a.js 暂存区中该文件的历史版本(fcd2093)覆盖工作区中对应的文件,此时(工作区、暂存区的文件a.js是fcd2093版本)。
- git reset --hard aaaa 强制将版本库回退到aaaa,但是远程仓库还是cccc
- git reset cccc 将head移到最新的版本(和远程的head保持一致,实际就是将远程暂存区的内容更新到最新版本cccc,工作区的内容还是保持在aaaa),此时aaaa和cccc的差异便作为本次更改的内容。
- git add / git commit / git push 提交后生成新的版本号dddd
此时git log 看到的最近的提交记录就是:aaaa -> bbbb -> cccc -> dddd
【注】也可以使用git revert cccc 和 git revert bbbb来实现,不过会新增两条回滚记录
如果删除远程仓库的最后一次提交的时候不需要保留历史记录的话,可以使用reset,命令如下:
git reset --hard HEAD^
git push origin master -f
保留半成品现场(存储临时现场)
子模块
有时工程太过庞大想要分出子工程单独管理,或者纳入一个子工程到当前工程来,就可能用到子模块功能。
$ git diff --cached subproject_demo diff --git a/subproject_demo b/subproject_demo new file mode 160000 index 0000000..aa1eeb0 --- /dev/null +++ b/subproject_demo @@ -0,0 +1 @@ +Subproject commit aa1eeb06e67608d7a2af179a7dfd9e594777e90f
chen_@DESKTOP-TJKEMKG MINGW64 /c/works/demo/subproject_demo ((aa1eeb0...)) // 发现没:aa1eeb0就是之前的哪个提交
如果你在项目中改了子模块的代码,准备提交到对应的分支(add和commit已经执行过),使用:
git push origin HEAD:<branch> 这样就把代码提交到对应的分支 ,和 git push origin <localBranch> <remoteBranch>类似
【注】引入私有git工程还可以又其他方式,比如和npm配合:《2018 年了,你还是只会 npm install 吗》查看“私有 git 共享 package”部分
打标签
你可以使用 阿里的AoneFlow模式 使用Git做分支管理,每次发完版本之后需要给当前的master打一个tag,表示发布的一个版本,以便追溯。
git tag,展示所有已经打过的标签
git tag -l 'v1.8.5*',匹配特定的标签查看
git tag -a v1.4 -m "my version 1.4",打附注标签
git tag -a v1.4 932cab, 后期给932cab提交补打上标签
git tag v1.4-lw,打轻量标签,没有标签信息
git tag -d v1.4,删除标签按【谨慎】
git git push origin :refs/tags/v1.4,删除远程v1.4这个标签
git show v1.4,命令可以看到标签信息与对应的提交信息
git push origin v1.4,共享标签,默认情况下,git push
命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上
git push origin --tags,一次性把所有标签push到远程
【注】:更详细查看https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE
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
合并commit/修改历史commit
合并commit用到git rebase,参考:https://www.cnblogs.com/laphome/p/11309834.html https://www.jianshu.com/p/964de879904a
需要注意的是,如果只是squash中间的部分节点。保存之后可能后面的pick执行会执行不了,提示如下
hint: Could not execute the todo command hint: hint: pick 4d45xxxx918364 xxxx hint: hint: It has been rescheduled; To edit the command before continuing, please hint: edit the todo list first: hint: hint: git rebase --edit-todo hint: git rebase --continue
明显后面的pick没有执行(导致漏掉),按提示先执行--edit-todo,然后--continue就OK
注意:然后要将修改过后的commit提交到远程(在提交之前不要使用git pull。这回导致之前合并之前的commit记录会被再次下载下来)。使用:git push -f 【需要特别注意,这个动作将不可回退,建议使用一个拷贝的分支来做这些动作】
修改历史commit查看:https://blog.csdn.net/jbj6568839z/article/details/102797968
注意:为了确保edit后面的pick继续执行,一定要执行“git rebase --continue” 。修改历史commit这个操作会在一个副本上进行。完毕只有需要将记录push到对应的分支上:
git push origin HEAD:<name-of-remote-branch> 如果失败,加 -f 强制覆盖(要特别小心,强制覆盖会导致之前的记录消失)
Enter passphrase for key '/c/Users/Administrator/.ssh/id_rsa'
https://www.jianshu.com/p/b6545f4cd317
- ssh-agent bash
- ssh-add ~/.ssh/id_rsa
更新一组依赖包
1.npm-check-updates
// 先下载 yarn global add npm-check-updates // 更新包(@kant @rousseau @alice)下的所有子包 ncu \"/@(kant|rousseau|alice)\\/\\S+/\" -u
2.upgrade-interactive
yarn upgrade-interactive --latest // 需要手动选择升级的依赖包,按空格键选择,a 键切换所有,i 键反选选择
yarn upgrade package@version // yarn.lock和package.json都会更新,但是会进行版本锁定 "echarts": "4.2.0-rc.2"
三、.gitignore
# 忽略文件夹,下面两种写法都可,会递归匹配所有的子文件夹 lib types/ # 忽略根目录下的文件夹 /.husky #忽略文件夹内容,但是其中某些文件不忽略,**表示递归,*表示只匹配最近的一层 packages/svg/** !packages/svg/index.d.ts # 忽略文件夹中的子文件推荐只用一个*。此时达到的效果和两个*是一样的 .vscode/* !.vscode/extensions.json !.vscode/settings.json *.suo *.ntvs* *.sw? # Logs logs *.log yarn-debug.log* yarn-error.log*
如果设置了.gitignore但是却没有生效,原因是 .gitignore 只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交。
git rm -r --cached . git add . git commit -m 'update .gitignore'
四、踩坑
[remote rejected] (hook declined)
完整日志:
$ git push Enumerating objects: 25, done. Counting objects: 100% (24/24), done. Delta compression using up to 8 threads Compressing objects: 100% (13/13), done. Writing objects: 100% (13/13), 1.20 KiB | 1.20 MiB/s, done. Total 13 (delta 11), reused 0 (delta 0) remote: git: 'refs/heads/web2.0' is not a git command. See 'git --help'. remote: error: hook declined to update refs/heads/web2.0 To https://e.coding.net/tops/front-www.git ! [remote rejected] web2.0 -> web2.0 (hook declined) error: failed to push some refs to 'https://e.coding.net/tops/front-www.git'
百度查看帮助,找到类似的问题:https://blog.csdn.net/weixin_39278265/article/details/102248258
本人的问题解决办法
git config --global --unset branch.web2.0.merge
然后再push就OK