首页 > 技术文章 > 【git】基本命令和操作的总结

mind18 2021-05-20 17:36 原文

【git】基本命令和操作的总结

一、介绍

git是一个开源的分布式版本控制系统。linus花了两周时间用C写的,其创建了开源系统linux。

管理项目的方式:本地部署git版本管理系统;基于git的在线代码托管平台github。

git的下载地址:http://git-scm.com/download/

在Mac OS及Linux下用终端工具(Terminal)来使用Git,而在Windows平台下用Git Bash工具

1、工作流程

  1. 克隆 Git 资源作为工作目录。
  2. 在克隆的资源上添加或修改文件。
  3. 如果其他人修改了,你可以更新资源。
  4. 在提交前查看修改。若有修改先拉再推。
  5. 修改完成后,若发现错误,可以撤回提交并再次修改并提交。

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@{0}

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、更新代码流程

  1. git status 命令查看当前变更(包括已删除文件)
  2. Git对已删除文件留有记忆,要通过 git rm 命令将其删除
  3. 如果删除的文件名带空格,通过双引号将文件名引起来, git rm “test case.py”
  4. git add 命令对当前目录下的文件添加跟踪
  5. git commit 命令将添加文件提交到本地仓库
  6. git push 将本地项目提交到远程仓库GitHub
  7. 除第一次下载项目需要通过 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>

推荐阅读