Git常用命令
SVN:集中式、增量式的版本控制管理工具。存在单点故障的问题,服务器一出问题,之前的代码版本就不容易找到了。增量式就是每次提交只保存与之前不相同的东西,然后要到某个版本A时就将原始版本与A之前的每个版本更新的东西拼凑出来版本A,可以节约空间。
Git:分布式的,以快照的方式控制管理版本。本地就有完整的历史。远程也有。
结构:
先在工作区写代码,写完用git add 命令提交到暂存区,再用git commit 提交到本地库。
局域网下可以用GitLab服务器做托管中心,外网下可以用GitHub或码云等。
在某个目录下空白处右击,出现Git bash here 选项,点击进去,可以用Linux指令进行操作,也就是说用tab补全命令、上下键翻用了的命令都可,git的命令都是以 git开头。补全命令有时候反应较慢。
在Git bash窗口内,鼠标左键选中哪些文字或字母就会被复制,可以直接右键选paste进行粘贴。
1、本地库初始化:
git init命令,初始化本地库,创建一个.git目录及一些文件,但看不到,因为隐藏目录,所以可以用 ll -a 命令看到。 .git目录中存放的是本地库相关的子目录和文件,不懂最好别动。
2、设置签名(设置一个本地用户名,作为一个标识,区分不同开发人员),此处的签名和登录远程库的账号密码没关系。
项目级别/仓库级别:仅在当前本地库范围内有效,也就是这个文件夹下。用
git config user.name 用户名
git config user.email 邮件地址。
系统用户级别:登录当前操作系统的用户级别。用
git config --global user.name 用户名
git config --global user.email 邮件地址。
优先级:就近原则,项目级别优先于系统用户(二者都有时)。
项目级别的用户信息保存在 .git/config中。系统用户级别的在用户的家目录cd ~去看隐藏文件。
3.查看工作区、暂存区状态git status
4.将新建/修改的文件向暂存区提交 git add 文件名
5.撤销向缓存区提交的某个文件 git rm --cached 文件名
6.向本地库提交缓存区中的东西。
①用git commit 文件名 会出现下方窗口,因为我安装时选择的是带vim编辑器的也就是可以添加一些描述,类似于注释。
②直接 git commit -m “描述信息”
7.git log查看日志记录(完整显示),进去的界面类似于Linux中less、more命令,空格翻页,回车显示下一行,q退出
简洁一些的显示 git log --pretty=oneline
git log --oneline 和上边差不多只是索引显示一部分,只靠这部分就可以区别于其他索引所以,没必要全显示出来。
git reflog 显示出来的会多一个某个版本(索引)到当前需要移动的步数
HEAD@{移动到当前版本需要多少步}
8.版本前进后退
①git reset --hard 索引。
表示跳到索引指向的那个版本,也就是上边查到的那些索引,后边也有每次提交时自己写的描述,按需要跳就完事了。
②只能后退
git reset --hard^ 表示退到上一个版本,有几个 ^ 就表示后退多少步(版本)
git reset --hard~步数 表示后退多少步(版本)
rest命令的三个参数对比:
–soft:仅仅在本地库移动head指针。
–mixed:在本地库移动head指针,重置暂存区。
hard:在本地库移动head指针,重置暂存区,重置工作区。
9.删除文件和找回文件
删除:
rm 文件名
git add 文件名 将删除操作提交到暂存区
git commit -m “操作描述” 文件名 提交删除到本地库
找回:
1.在上个命令中我们发现本可以前进,也可以后退,也就是说被提交到本地库的操作记录会被保存下来,删除操作也提交了所以删除操作的记录也会被保存下来。所以,找回文件我们可以退回到文件被删除之前的那个版本,文件就被找回来了。
2.删除,并且提交到了暂存区,但没提交到本地库的文件。可以通过,git --hard head命令来找回,因为没有提交到本地库所以还没生成新的记录,git --hard head直接回退到本次操作记录的开始。
10.比较文件
git diff 文件名 修改文件后用来查看文件哪些地方被修改了,以行为单位,你修改的行它会先被删除,再变为你修改的内容。
比如此处,红线处是之前的内容,进行修改后是先将红线处内容删除,再变为绿色字体处的内容。我做的是将apple 修改为了apple @@@@@@@
也可以git diff 版本 文件名 将工作区当前文件和此文件在某个版本的内容进行比较。
不指定文件名时会将当前工作区的多个文件和上个版本进行比较。
11.分支,在版本控制过程中,使用多条分支同时推进多个任务,提高开发效率,各分支独立进行,不会互相影响,最终将开发完成的功能整合到主分支上。
主分支本来就是存在的不需要创建。
查看当前拥有的分支:git branch -v
创建一个分支:git branch 分支名
分支切换:git checkout 分支名
合并分支:先要切换到需要整合内容进来的分支上,然后git merge 要被整合进当前分支的分支名。
合并产生冲突的问题:当两个要整合的分支上修改了同一个文件的同一个位置,git就不知道给舍去哪个,所以就产生了冲突。
如:我在主分支和temp分支同时修改了good.txt第四行的内容,然后将两个分支内容整合,就会出现
我们按需要删除以及保留相应内容,保存添加提交(add、commit),问题就解决了。此处提交时不用写文件名不然会出错。
存储内容时是通过Hash算法将信息计算出哈希值保存,管理分支时是通过指针指向某个版本。
12.在本地库创建远程地址的别名:git remote add 别名 地址
通过git remote -v查看
13.远程推送到github,通过git push 地址别名 分支名。当推送时如果要推送的文件不是基于最新的文件版本进行的修改,也就是说别人比你提前推送过这个文件,这时就会产生冲突,推送失败。这时就需要我们将远程的文件先拉去到本地,进行融合,然后解决融合冲突,添加提交就行。
14.克隆到本地:git clone 仓库地址
克隆是将完整的远程库下载到本地,并且创建远程地址别名,初始化本地库。
15.拉去,git fetch 地址别名 远程分支名,效果是将远程库地址的内容拉去到本地,只是拉取到本地,还没融合。融合git merge 远程地址库别名/远程分支名。
git pull 地址别名 远程分支名,效果相当于同时用了fetch和merge