目录
常用命令
一、创建仓库
本地到远程
1. 本地创建
在本地新建的项目目录内(就是空文件夹)打开 git bash(win右键),输入
git init
完成初始化
安装git问题以及链接远程库的问题参考:https://blog.csdn.net/qq_29493173/article/details/113094143
选择下载项目ZIP到本地以后的流程类似
2. 下载项目到本地
远程到本地
复现或者修改别人的仓库,要先fork一下,使自己的账户里出现一个同样的仓库,然后复制自己仓库的链接,否则有可能是没有权限推送分支的。
即
在GitHub上,可以任意Fork开源仓库;
自己拥有Fork后的仓库的读写权限;
可以推送pull request给官方仓库来贡献代码。
用git clone下载:
需要更改的部分是服务名,用户名和仓库名
从github拷贝的项目服务名就是github,其他类似
git clone git@服务名.com:用户名/仓库名.git
或者可以直接从下图中红框处点击复制链接
然后在git bash中
git clone 复制的链接
就行了
引用廖大佬的话:
GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https
二、查看状态
查看当前状态
git status
查看远程库状态
git remote -v
三、添加到缓存区
缓存区的概念图
借自廖雪峰大佬那里
添加
git add filename
删除
首先,可以在本地进行删除,即对工作区进行操作
其次,对暂存区的操作和add类似,有:
git rm filename
小提示:先手动删除文件,然后使用git add和直接使用git rm 删除文件效果是一样的,git rm会直接删除暂存区和工作区的对应文件。
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
也就是说如果新增文件没有经过commit就删除了,就无法用git找回了。
删除以后进行上传命令commmit,就删除了暂存区中的对应文件。
可以多次添加/删除,也可以同时添加多个文件,但add/rm操作只是添加到暂存区staged
四、操作回退
1. add/rm之前的修改是工作区内的修改,可以通过checkout回退工作区中的修改(工作区回退)
git checkout -- filename
或者(上面老方法,下面新方法)
git restore filename
如果已经添加到暂存区中没上传,会回退到暂存区内的版本,若没有,会回退到最新的版本库版本。
2. add/rm操作后的工作区修改可以通过下面命令退回到add/rm到暂存区之前的状态(暂存区回退)
git reset HEAD filename
或者(上面老方法,下面新方法)
git restore --staged filename
3. 解除本地库与远程库的连接:origin是默认的远程库名,以自己建立连接时设定的名字为准
```git
git remote rm origin
git remote rm origin
五、上传到版本库
提交命令
git commit -m "此次提交的备注"
每提交一次就会给版本库的时间轴多一个节点
养成好习惯,提交上传带备注!
版本跳转
版本跳转是本地版本库的操作,如果已经远程push到远程库,则无法对push以后的内容进行回退了,因为接下来的操作是远程库负责的。
版本可以通过两种方式跳转:
1. 版本回退,相对指针HEAD指向当前最新版本,HEAD^指向上一个版本 以此类推 前100个版本为HEAD~100,通过这种方式回退以后 后面的版本显然就变成了未来版本,无法再通过相对指针回到未来。
git reset --hard HEAD^
2. 绝对指针跳转,每个版本由32位的随机代码组成,输入前几位绝对代码值可以进行任意版本的跳转:
```git
git reset --hard 3d3c
上面命令可以跳转到3d3c开头的代码指向的版本,记住绝对值码,就可以跳转到任意版本,查看绝对值码的方法为:
六、查看日志
查看提交日志
默认查看详细日志,也可以通过参数查看简明日志
查看命令日志
命令日志中包括回退操作在内的所有版本相关操作都有记录
1. 详细日志
git log
2. 简明日志
git log --pretty=oneline
3. 命令日志
git reflog
三种查看日志的方法返回的结果中,每个日志开头的就是版本号,下面是reflog的例子,每行记录一个命令日志,前七位就是版本号
七、分支
分支的功能就类似于C语言中的指针,所以git中对分支的操作是非常快捷和高效的,并不是每创建一个分支都创建了新的一堆当前状态的文件,而只是多了一个指针而已,分支的合并也只需要两个指针指向同一个位置即可,所以分支的合并是非常重要的事情,要慎重!
创建分支有两种方法
git checkout -b 分支名
以及
git branch 分支名
第一种的-b参数表示创建后转换到新创建的分支,相当于先创建再切换两步合一,新建分支时比较常用
第二种是git branch命令,是针对分支的各种操作,不加参数时就是创建一个分支
分支操作branch
常用的git branch命令参数有:
-a 查看所有本地和(已建立联系的)远程分支
-d 删除分支
分支的切换
git checkout 分支名
checkout既能回退操作又能切换分支显然有些功能定位不明确,所以有专门的分支切换命令
git switch 分支名
常用参数:
-c 创建并切换
注意 大坑
git switch切换分支时会把未add或未commit的内容带过去
以前的旧版本git中,B分支下进行的操作改动没有add和commit时是无法跳转到其他分支的,但新版本目前可以
参考某网友的观点,“因为未add的内容不属于任何一个分支, 未commit的内容也不属于任何一个分支。 也就是说,对于所有分支而言, 工作区和暂存区是公共的”
所以就会出现在B分支下改动且未更新到缓冲区和版本库上的文件,在A分支上可以看到已经被修改,且如果此时用A分支添加和提交,日志中就会把这次修改算到A分支上
所以,切换分支前,一定要git status !!!
如果确实有尚未add和commit的工作,但是并未完成不方便进行提交,可以利用git stash进行现场保留,然后跳转。
实测(比较绕可以不看):
在B分支中改动文件后直接切换至A分支,然后查看同名文件,此时从A分支看到的是B分支修改过后的那个而不是A分支本来保存的那个,再切换回B分支,将在B分支中改动的文件在B分支中上传后再切换至A分支,此时AB分支的同一个文件内容就不同了,B分支中为修改过后的,A分支中为A最近保存过的
而git checkout 会直接报错不能切换,
分支的合并merge
git merge 分支名
该命令表示将特定分支合并到当前分支
注意 不同分支同时上传了对同一个文件的修改时,合并这两个分支会产生冲突,需要先解决冲突才能合并,此时状态会变成合并状态,只有提交了解决冲突后的文件时,才会变成正常状态
查看分支合成图
git log --graph --pretty=oneline --abbrev-commit
分支的删除
git branch -d 分支名
没有合并的分支可能在删除的时候会报错,如果确实要删除,可以用-D来强制删除
分支的使用
尽量在主分支master上创建dev分支作为日常工作的分支,只将主分支作为发布新版本集合的分支,平常的工作都先经过提交给dev后积累到一定程度并保证无冲突再提交到主分支,相当于给默认展示的主分支一个缓冲区,避免不必要的麻烦。
bug分支
在有分支未提交或暂时无法提交的情况下,需要切换分支修复bug时可以使用git stash保留现场,此时查看状态会发现状态已经正常,进行完bug修复后,再通过git stash list查看快照列表
恢复现场有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不会删除,需要用git stash drop手动删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了。
相关代码为:
保存现场
git stash
现场列表
git stash list
弹出第一个现场的副本
git stash apply
弹出第一个现场
git stash pop
恢复列表中指定的stash:(大括号中为下标)
git stash apply stash@{0}
在主分支上修复了bug后,开发用的dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。
同样的bug,要在dev上修复,只需要把修复bug的那次提交所做的修改“复制”到dev分支。
为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:
跳转到需要同步修复的分支,如dev
git checkout dev
同步某一个修改到当前分支 后面的七位code替换为待同步的commit的代码
git cherry-pick e3ddb80
修改上游分支
要修改本地分支的上游远程分支,可以使用 git branch
命令来实现。下面是在 Git 中修改本地分支的上游远程分支的步骤:
-
查看当前分支的上游远程分支:
在终端或命令提示符中,进入到你的项目目录,并运行以下命令来查看当前分支的上游远程分支:
git branch -vv
这会列出所有本地分支及其关联的远程分支。找到你想要修改上游分支的本地分支。
-
修改上游远程分支:
假设你想要将本地分支
feature
的上游远程分支修改为origin/development
,你可以运行以下命令:git branch --set-upstream-to=origin/development feature
这将把本地分支
feature
的上游远程分支更改为origin/development
。或者,你也可以使用简化的形式:
git branch -u origin/development feature
如果你想将上游远程分支置空,可以使用以下命令:
git branch --unset-upstream feature
确认修改:
运行
git branch -vv
再次确认上游远程分支是否已经成功修改。
请注意,以上命令中的 feature
是本地分支的名称,origin/development
是你希望设置为上游分支的远程分支名称。确保在运行命令时,替换为你实际使用的分支名称。
这些命令将帮助你在 Git 中修改本地分支的上游远程分支。
八、pull和push
连接到库后,远程同步分支,要使一个本地分支和远程库中的分支建立默认连接时,加-u参数
branchname改成要推送的本地分支名称,如master,dev……
推送到远程分支
git push origin branchname
建立默认连接
git push -u origin master
获取远程分支信息(即github上的远程分支)
git fetch
将远程分支拉取到本地创建本地分支,本地和远程分支最好同名
git checkout -b branch-name origin/branch-name
在进行push操作时如果报错冲突,需要先pull解决冲突再push
git pull
九、标签
标签其实也是指向版本库中某次commit的指针,意义在于不需要再去找和记住某个特定版本的版本号前几位,可以通过标签直接跳转到指定版本
创建标签v1.0
git tag v1.0
查看标签
git tag
给指定的提交(假设版本号为f52c633)打标签
git tag v1.1 f52c633
如果要加备注,使用两个参数
git tag -a 标签名 -m "标签备注"
查看标签信息
git show tagname
删除标签
git tag -d tagname
推送标签
git push origin tagname
一次性推送标签
git push origin --tags
删除远程标签
git push origin :refs/tags/tagname
已知特性
- 在git bash命令行中,可以使用windows和linux的命令
- git暂存区存的是文件的修改而不是文件
- git版本库中使用HEAD指针指向当前的版本
- unix的哲学,没有消息就是好消息
- push之前的操作都是直接对本地文件进行的,会对工作区的文件实时产生影响。
本文为自学笔记,更详细的git教程请移步 廖雪峰
配置忽略文件笔记
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files …,有强迫症的童鞋心里肯定不爽。
好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
忽略文件的原则是:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
over~