【git】基本命令和操作的总结
【git】基本命令和操作的总结
一、介绍
git是一个开源的分布式版本控制系统。linus花了两周时间用C写的,其创建了开源系统linux。
管理项目的方式:本地部署git版本管理系统;基于git的在线代码托管平台github。
git的下载地址:http://git-scm.com/download/
在Mac OS及Linux下用终端工具(Terminal)来使用Git,而在Windows平台下用Git Bash工具
1、工作流程
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。若有修改先拉再推。
- 修改完成后,若发现错误,可以撤回提交并再次修改并提交。
2、git与svn的区别:
Git :分布式(版本库可存放在每个人的电脑里)
SVN:集中式(版本库集中存放在中央服务器)
Git:把内容按元数据方式存储
SVN:是按文件
Git 分支和 SVN 的分支不同:SVN的分支就是版本库中的另外一个目录
Git 没有一个全局的版本号,而 SVN 有(目前为止跟SVN相比,Git缺少的最大一个特征)
Git 的内容完整性要优于SVN:Git的内容存储使用SHA-1哈希算法(能确保代码内容的完整性;遇到磁盘故障和网络问题时降低对版本库的破坏)
3、基本概念
工作区:在你电脑里能看到的目录
暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以暂存区也叫索引(index)
版本库:工作区的隐藏目录.git,这个不算工作区,而是Git的版本库,版本库里存了很多东西。
(包括称为index的暂存区、Git自动创建的第一个分支master、指向master的一个指针HEAD)
二、 git 和 github 建立链接
使用SSH key认证方式来保证本地Git与GitHub服务器之间通信安全。
1、进入ssh目录
$ cd ~/.ssh # 检查本机的ssh密钥,提示:No such file or directory 说明是第一次使用git
# 若不是第一次使用,则清理原有ssh密钥:
$ mkdir key_backup
$ cp id_rsa* key_backup
$ rm id_rsa*
2、生成新 SSH 秘钥
$ ssh-keygen -t rsa -C "邮箱"+3个回车
回车后会提示你输入一个密码,这个密码会在你提交项目时使用,如果为空的话提交项目时则不用输入。这个设置是防止别人往你的项目里提交内容。
会生成两个文件,id_rsa 是私钥,id_rsa.pub 是公钥。记住千万不要把私钥文件id_rsa 透露给任何人。
3、添加 SSH 公钥到 GitHub
cat
命令复制公钥文件~/.ssh/id_rsa.pub
的所有内容。
登录GitHub,单击个人头像→Settings→SSH Keys→Add SSH Keys ,在 Title中输入任意字符,在 Key文本框粘贴复制的公钥,单击“Add key”按钮完成操作
4、测试连接
git中运行命令:$ ssh –T git@github.com
git会输出SSH警告:
- 告诉我们已经把GitHub的Key添加到本机的一个信任列表里了。第一次使用clone或push命令连接GitHub时也会得到这个警告。这个警告只会出现一次,后面的操作就不会出现。
- Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车提示successfully,连接成功。
5、提交代码到github前
设置仓库人员的用户名和邮箱地址,github每次commit都会记录他们
git config --global user.name "username"
git config --global user.email "user@mail.com"
三、git提交代码到github
1、github创建项目
登录 GitHub,单击页面右上角加号“+” ,选择“New repository”。
填写项目名称及描述,默认项目为“Public”。创建“Private”项目,GitHub需要收费。单击“Create repository”完成创建。创建完一个项目后,GitHub会提示我们如何提交项目到它上面。
2、代码到本地仓库
1、git init:
- 初始化一个 Git 仓库,目录名与GitHub上创建的项目名保持一致。Git 的很多命令都需要在 Git 的仓库中运行。
- 生成 .git 目录。包含资源的所有元数据,其他项目目录保持不变。跟踪管理版本。
2、git add:添加文件到暂存区。git add . :添加当前目录下的所有文件到暂存区。
3、git status:查看当前项目下所有文件的状态。
- to be committed:未提交
- modified:未提交的文件有修改
- Untracked:被添加过
- nothing to commit:没有需要提交的修改
4、git diff:
比较文件在暂存区和工作区的差异:显示已写入暂存区和已被修改但未写入暂存区文件的区别
git diff --cached/--stage [file]: 显示暂存区和上一次提交(commit)的差异
5、git commit:将暂存区内容添加到本地仓库中。若不设置参数,Git 会打开一个编辑器以填写提交信息。
-m :对本次的提交加以描述
git commit -a:设置修改文件后不需要执行 git add 命令,直接提交
注意:提交修改和提交新文件是一样的2步:第一步:git add, 第二步:git commit。
6、git rm:将文件从暂存区和工作区中删除
文件提交到版本库后,在工作区中删除该文件:git status 会提示deleted(1、使用 git rm file 删除暂存区的文件,再 git commit;2、也可使用 git checkout --file 从版本库中恢复工作区的文件)。
删除之前修改过并已经放到暂存区:git rm -f 强制从暂存区和工作区删除。
把文件从暂存区移除,但仍保留在当前工作目录:git rm --cached
3、代码到github
GitHub提供了两种链接方式:HTTPS和SSH,提交的地址有所不同。
1、进入版本库所在目录,“git remote add origin SSH/http”
第一次提交项目,这一句非常重要,它会将本地的项目与远程的仓库之间建立连接。origin是远程库,Git默认的叫法。
2、git push:
git push <远程主机名> <本地分支名>:<远程分支名>
- 本地分支与远程分支相同,可省略为:git push <远程主机名> <本地分支名>
- 本地与远程版本有差异,强制推送用 --force:git push --force origin master
- 删除主机的分支可以使用 --delete 参数:git push origin --delete master,表示删除 origin 主机的 master 分支
第一次推送master的所有内容时:使用 git push -u origin master;由于远程库是空的,第一次推送加上-u,以后推送或拉取时就可以简化命令。Git会把本地的master推送到远程新的master,还会把本地的master和远程的master关联起来。
此后,本地master分支的修改提交后,可使用git push origin master推送。
访问GitHub就可看到我们提交的项目
4、克隆远程仓库到本地
通过SSH:git clone git@github.com:defngj/project-name.git
通过https:git clone https://github.com/defngj/project-name。 速度慢,每次推送都必须输入口令,但某些只开放http端口的公司,内部就无法使用ssh协议
四、版本回退
1、git log:查看版本库历史提交记录(commit)。 --oneline 选项查看历史记录的简洁的版本。
git log --author
:查找指定用户的提交日志。
git blame <file>
:查看指定文件的修改记录。
2、git reset:用于回退版本,可以指定退回某一次提交的版本。
选项:[--soft | --mixed | --hard]
- 默认为--mixed:
- git reset [HEAD]:重置暂存区文件,取消之前的git add操作,与上一次commit保持一致,但工作区不变。HEAD 指向的版本就是当前版本,HEAD^:上一个版本;HEAD~100:往上100个版本。
- git reset [commit]:重置暂存区,但工作区不变。重置当前分支的指针为指定commit。
- --hard:重置暂存区与工作区,与上一次commit保持一致。
- git reset --hard origin/master:将本地的状态回退到和远程的一样
- fit reset --hard HEAD^:工作区、暂存区、版本库都回退到上一个版本。前提:未提交到远程仓库。
- git reset --soft HEAD:回退到某个版本?
3、git reflog:显示当前分支的最近几次提交和回退。
4、git blame
五、分支管理
1、创建合并分支
1、git checkout:
git checkout -- file
:让文件回到最近一次git commit或git add时的状态
git checkout (branchname)
:切换分支
git checkout -b dev
:创建并切换到dev分支,相当于git branch dev + git checkout dev
2、git branch:没有参数时,会列出分支,当前分支有*号
git branch (branchname)
:创建分支命令
git branch -d dev
:删除分支
3、git switch:
git switch -c dev
:创建并切换到新的dev分支
git switch master
:切换到已有的master
4、git merge:
git merge dev
:合并指定分支到当前分支。用Fast forward(快进模式,直接把master指向dev的当前提交,合并速度非常快),但该模式下删除分支后,会丢掉分支信息。当然,也不是每次合并都能Fast-forward,后面会讲其他方式的合并
git merge --no-ff -m "no-ff" dev
:--no-ff:禁用Fast forward,用普通模式合并。会生成一个新的commit,所以加上-m,描述commit
2、合并分支冲突
两分支中一个文件中同一位置的内容不一致,合并时会有冲突。
冲突内容:显示在当前分支的文件中。用<<<<<<<,=======,>>>>>>>标记
Git无法自动合并分支:首先解决冲突。解决后,再提交,合并完成。(解决冲突:合并失败的文件手动编辑为正确的内容,再提交)
3、bug分支
修复bug,通过创建新的bug分支进行修复,然后合并,最后删除。(手头工作未完成时,先把工作现场git stash,再修复bug,修复后再git stash pop,回到工作现场)
1、git stash:把当前工作现场“储藏”起来。再用git status查看工作区,就是干净的。
- git stash list:查看‘存储’的工作现场
- 恢复:
- git stash apply:恢复后,stash内容并不删除,需要用git stash drop来删除
- git stash pop:恢复的同时把stash内容删除。再用git stash list就查看不到任何stash内容
- 可以多次stash,恢复时,先用git stash list查看,然后恢复指定的stash:git stash apply stash@
2、在master分支上修复的bug,想要合并到dev:可复制master的提交4c805e2到dev分支
git cherry-pick 4c805e2
:复制一个特定的提交到当前分支。自动给dev做了一次提交,提交的commit时1d4b803
4、拉取远程分支并创建本地分支
方法一:
使用如下命令:
git checkout -b 本地分支名x origin/远程分支名x
使用该方式会在本地新建分支x,并自动切换到该本地分支x。
采用此种方法建立的本地分支会和远程分支建立映射关系。
方式二:
使用如下命令:
git fetch origin 远程分支名x:本地分支名x
使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checkout。
采用此种方法建立的本地分支不会和远程分支建立映射关系。
本地分支和远程分支建立映射关系的作用:
git branch --set-upstream-to origin/远程分支名 本地分支名
六、其他
1、更新代码流程
git status
命令查看当前变更(包括已删除文件)- Git对已删除文件留有记忆,要通过
git rm
命令将其删除 - 如果删除的文件名带空格,通过双引号将文件名引起来,
git rm “test case.py”
git add
命令对当前目录下的文件添加跟踪git commit
命令将添加文件提交到本地仓库git push
将本地项目提交到远程仓库GitHub- 除第一次下载项目需要通过
git clone
将项目克隆到本地外,后续使用git pull
直接将更新拉取到本地
git push 命令:git push <远程主机名> <本地分支名>:<远程分支名>
;
本地分支名与远程分支名相同,可省略为git push <远程主机名> <本地分支名>
。如:git push origin master
2、git远程仓库管理:
git remote -v:查看本地已关联的远程仓库
git remote add [shortname][url]:添加远程仓库
git fetch [remote-name]:从远程仓库抓取数据到本地
git remote show origin:查看远程仓库信息
git remote rename origin jrd:重命名远程仓库
git remote rm jrd:删除关联的远程仓库
3、忽略文件
上传git项目时,有不需要上传的文件,如:python的缓存、编译文件、report的报告、pycharm的.idea。
忽略文件名字:.gitgnore。放在项目目录下(和.git同目录)。
github自带python的忽略文件,在忽略文件中加上report和idea就可以。
4、冲突解决办法
用git pull来更新代码的时候,遇到了下面的问题:
error: Your local changes to the following files would be overwritten by merge:
*********************************************************
Please, commit your changes or stash them before you can merge.
Aborting
出现这个问题的原因是其他人修改了xxx.php并提交到版本库中去了,而你本地也修改了xxx.php,这时候你进行git pull操作就好出现冲突了,解决方法,在上面的提示中也说的很明确了。
1、保留本地的修改的改法
1)直接commit本地的修改 ----也一般不用这种方法
2)通过git stash ---- 通常用这种方法
通过git stash将工作区恢复到上次提交的内容,同时备份本地所做的修改,之后就可以正常git pull了,git pull完成后,执行git stash pop将之前本地做的修改应用到当前工作区。
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
**2、放弃本地修改 的改法 ** ----这种方法会丢弃本地修改的代码,而且不可找回
git reset --hard
git pull<br><br><br><br><br><br>