Git使用教程总和

发布时间 2023-06-21 16:42:38作者: Chimengmeng

Git使用教程

【一】下载安装(Windows)

【1】获取Git安装程序

Git官网地址:https://git-scm.com/downloads

  • 因为我们是用Windows系统上的浏览器访问的,Git官网自动之别到了我使用的操作系统,所以右侧直接显示下载使用Windows系统的最新版本(如果识别错误,可以在中间选择系统),点击即可下载。
  • 当前下载的是 2.24.0 for Windows,文件名称是“Git-2.24.0.2-64-bit.exe”。
  • 下载到电脑上之后,鼠标双击这个文件即可进入安装过程。

【2】Git安装过程

  • 双击看到的第一个界面如下图:

(1)使用许可声明

  • 点击“Next”进入下图页面:

(2)选择安装路径

  • 在输入框内输入想要安装到的本机路径,也就是实际文件夹位置,或点击“Browse...”选择已经存在的文件夹,然后点击“Next”按钮继续,进入下图界面:

(3)选择安装组件

  • 上图红框内的选项是默认勾选的,建议不要动。
  • 绿色框1是决定是否在桌面创建快捷方式的。
  • 绿色框2是决定在所有控制台窗口中使用TrueType字体和是否每天检查Git是否有Windows更新的。
  • 这些根据自己需要选择。
  • 点击“Next”按钮进入下图界面:

(4)选择开始菜单页

  • 这个界面是创建开始菜单中的名称,不需要修改,直接点“Next”按钮继续到下图的界面:

(5)选择Git文件默认的编辑器

  • 这个页面是在选择Git文件默认的编辑器,很少用到,所以默认Vim即可
  • 直接点“Next”按钮继续到下图的界面:

(6)调整您的PATH环境

  • 这个界面是调整您的PATH环境。
    • 第一种配置是“仅从Git Bash使用Git”。这是最安全的选择,因为您的PATH根本不会被修改。您只能使用 Git Bash 的 Git 命令行工具。但是这将不能通过第三方软件使用。
  • 第二种配置是“从命令行以及第三方软件进行Git”。该选项被认为是安全的,因为它仅向PATH添加了一些最小的Git包装器,以避免使用可选的Unix工具造成环境混乱。
    您将能够从Git Bash,命令提示符和Windows PowerShell以及在PATH中寻找Git的任何第三方软件中使用Git。这也是推荐的选项。
  • 第三种配置是“从命令提示符使用Git和可选的Unix工具”。警告:这将覆盖Windows工具,如 “ find 和 sort ”。只有在了解其含义后才使用此选项。
  • 我选择推荐的选项第二种配置,点击“Next”按钮继续到下图的界面:

(7)选择HTTPS后端传输

  • 这个界面是选择HTTPS后端传输。
  • 第一个选项是“使用 OpenSSL 库”。
    • 服务器证书将使用ca-bundle.crt文件进行验证。这也是我们常用的选项。
  • 第二个选项是“使用本地 Windows 安全通道库”。服务器证书将使用Windows证书存储验证。此选项还允许您使用公司的内部根CA证书,例如通过Active Directory Domain Services 。
  • 我使用默认选项第一项,点击“Next”按钮继续到下图的界面:

(8)配置行尾符号转换

  • 这个界面是配置行尾符号转换。
  • 第一个选项是“签出Windows风格,提交Unix风格的行尾”。
    • 签出文本文件时,Git会将LF转换为CRLF。提交文本文件时,CRLF将转换为LF。
    • 对于跨平台项目,这是Windows上的推荐设置(“ core.autocrlf”设置为“ true”)
  • 第二个选项是“按原样签出,提交Unix样式的行尾”。
    • 签出文本文件时,Git不会执行任何转换。 提交文本文件时,CRLF将转换为LF。
    • 对于跨平台项目,这是Unix上的建议设置(“ core.autocrlf”设置为“ input”)
  • 第三种选项是“按原样签出,按原样提交”。
    • 当签出或提交文本文件时,Git不会执行任何转换。
    • 不建议跨平台项目选择此选项(“ core.autocrlf”设置为“ false”)
  • 我选择第一种选项,点击“Next”按钮继续到下图的界面:

(9)配置终端模拟器以与Git Bash一起使用

  • 这个界面是配置终端模拟器以与Git Bash一起使用。
  • 第一个选项是“使用MinTTY(MSYS2的默认终端)”。
    • Git Bash将使用MinTTY作为终端模拟器,该模拟器具有可调整大小的窗口,非矩形选择和Unicode字体。
    • Windows控制台程序(例如交互式Python)必须通过“ winpty”启动才能在MinTTY中运行。
  • 第二个选项是“使用Windows的默认控制台窗口”。
    • Git将使用Windows的默认控制台窗口(“cmd.exe”),该窗口可以与Win32控制台程序(如交互式Python或node.js)一起使用,但默认的回滚非常有限,需要配置为使用unicode 字体以正确显示非ASCII字符,并且在Windows 10之前,其窗口不能自由调整大小,并且只允许矩形文本选择。
  • 我选择默认的第一种选项,点击“Next”按钮继续到下图的界面:

(10)配置配置额外的选项

  • 这个界面是配置配置额外的选项。
  • 第一个选项是“启用文件系统缓存”。
    • 文件系统数据将被批量读取并缓存在内存中用于某些操作(“core.fscache”设置为“true”)。
    • 这提供了显著的性能提升。
  • 第二个选项是“启用Git凭证管理器”。
    • Windows的Git凭证管理器为Windows提供安全的Git凭证存储,最显着的是对Visual Studio Team Services和GitHub的多因素身份验证支持。 (需要.NET Framework v4.5.1或更高版本)。
  • 第三个选项是“启用符号链接”。
    • 启用符号链接(需要SeCreateSymbolicLink权限)。
    • 请注意,现有存储库不受此设置的影响。
  • 我勾选默认的第一、第二选项,点击“Next”按钮继续到下图的界面:

(11)配置实验选项

  • 这个界面是配置实验选项。
  • 启用实验性的内置添加 -i / -p。(新!)使用实验性的内置交互式add(“ git add -i”或“ git add -p”)。
    • 这使其速度更快(尤其是启动!),但尚未被认为是可靠的。
  • 默认不勾选,直接点击“Next”按钮继续到下图的安装进度界面:

(12)安装进度指示

  • 安装进度结束之后,会出现下图的完成Git安装向导界面:

(13)安装完成

  • 在这个界面,可以勾选是否启动启动Git Bash和是否查看发行说明,然后点“Finish”按钮退出安装界面。

(14)启动测试

  • 到此,Git的安装完成
    • 可以在开始菜单中看到Git的三个启动图标(Git Bash、Git CMD(Deprecated)、Git GUI)。
  • Git Bash
    • 是Git配套的一个控制台
  • 点击打开如下图:

  • Git CMD(Deprecated)
    • 是通过CMD使用Git(不推荐使用),点击打开如下图:

  • Git GUI
    • 是Git的可视化操作工具,点击打开如下图:

关于Git的安装过程就介绍到这里。

【二】Git常用命令大全

官方文档:Git 大全 - Gitee.com

【1】仓库

(1)在当前目录新建一个Git代码库

$ git init

(2)新建一个目录,将其初始化为Git代码库

$ git init [project-name]

(3)下载一个项目和它的整个代码历史

$ git clone [url]

【2】配置

(1)显示当前的Git配置

$ git config --list

(2)编辑Git配置文件

$ git config -e [--global]

(3)设置提交代码时的用户信息

$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

【3】增加/删除文件

(1)添加指定文件到暂存区

$ git add [file1] [file2] ...

(2)添加指定目录到暂存区,包括子目录

$ git add [dir]

(3)添加当前目录的所有文件到暂存区

$ git add .

(4)添加每个变化前,都会要求确认

  • 对于同一个文件的多处变化,可以实现分次提交
$ git add -p

(5)删除工作区文件,并且将这次删除放入暂存区

$ git rm [file1] [file2] ...

(6)停止追踪指定文件,但该文件会保留在工作区

$ git rm --cached [file]

(7)改名文件,并且将这个改名放入暂存区

$ git mv [file-original] [file-renamed]

【4】代码提交

(1)提交暂存区到仓库区

$ git commit -m [message]

(2)提交暂存区的指定文件到仓库区

$ git commit [file1] [file2] ... -m [message]

(3)提交工作区自上次commit之后的变化,直接到仓库区

$ git commit -a

(4)提交时显示所有diff信息

$ git commit -v

(5)使用一次新的commit,替代上一次提交

  • 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

(6)重做上一次commit,并包括指定文件的新变化

$ git commit --amend [file1] [file2] ...

【5】分支

(1)列出所有本地分支

$ git branch

(2)列出所有远程分支

$ git branch -r

(3)列出所有本地分支和远程分支

$ git branch -a

(4)新建一个分支,但依然停留在当前分支

$ git branch [branch-name]

(5)新建一个分支,并切换到该分支

$ git checkout -b [branch]

(6)新建一个分支,指向指定commit

$ git branch [branch] [commit]

(7)新建一个分支,与指定的远程分支建立追踪关系

$ git branch --track [branch] [remote-branch]

(8)切换到指定分支,并更新工作区

$ git checkout [branch-name]

(9)建立追踪关系,在现有分支与指定的远程分支之间

$ git branch --set-upstream [branch] [remote-branch]

(10)切换到上一个分支

$ git checkout -

(11)合并指定分支到当前分支

$ git merge [branch]

(12)选择一个commit,合并进当前分支

$ git cherry-pick [commit]

(13)删除分支

$ git branch -d [branch-name]

(14)删除远程分支

$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

【6】标签

(1)列出所有tag

$ git tag

(2)新建一个tag在当前commit

$ git tag [tag]

(3)新建一个tag在指定commit

$ git tag [tag] [commit]

(4)删除本地tag

$ git tag -d [tag]

(5)删除远程tag

$ git push origin :refs/tags/[tagName]

(6)查看tag信息

$ git show [tag]

(7)提交指定tag

$ git push [remote] [tag]

(8)提交所有tag

$ git push [remote] --tags

(9)新建一个分支,指向某个tag

$ git checkout -b [branch] [tag]

【7】查看信息

(1)显示有变更的文件

$ git status

(2)显示当前分支的版本历史

$ git log

(3)显示commit历史,以及每次commit发生变更的文件

$ git log --stat

(4)搜索提交历史,根据关键词

$ git log -S [keyword]

(5)显示某个commit之后的所有变动,每个commit占据一行

$ git log [tag] HEAD --pretty=format:%s

(6)显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件

$ git log [tag] HEAD --grep feature

(7)显示某个文件的版本历史,包括文件改名

$ git log --follow [file]
$ git whatchanged [file]

(8)显示指定文件相关的每一次diff

$ git log -p [file]

(9)显示过去5次提交

$ git log -5 --pretty --oneline

(10)显示所有提交过的用户,按提交次数排序

$ git shortlog -sn

(11)显示指定文件是什么人在什么时间修改过

$ git blame [file]

(12)显示暂存区和工作区的差异

$ git diff

(13)显示暂存区和上一个commit的差异

$ git diff --cached [file]

(14)显示工作区与当前分支最新commit之间的差异

$ git diff HEAD

(15)显示两次提交之间的差异

$ git diff [first-branch]...[second-branch]

(16)显示今天你写了多少行代码

$ git diff --shortstat "@{0 day ago}"

(17)显示某次提交的元数据和内容变化

$ git show [commit]

(18)显示某次提交发生变化的文件

$ git show --name-only [commit]

(19)显示某次提交时,某个文件的内容

$ git show [commit]:[filename]

(20)显示当前分支的最近几次提交

$ git reflog

【8】远程同步

(1)下载远程仓库的所有变动

$ git fetch [remote]

(2)显示所有远程仓库

$ git remote -v

(3)显示某个远程仓库的信息

$ git remote show [remote]

(4)增加一个新的远程仓库,并命名

$ git remote add [shortname] [url]

(5)取回远程仓库的变化,并与本地分支合并

$ git pull [remote] [branch]

(6)上传本地指定分支到远程仓库

$ git push [remote] [branch]

(7)强行推送当前分支到远程仓库,即使有冲突

$ git push [remote] --force

(8)推送所有分支到远程仓库

$ git push [remote] --all

【9】撤销

(1)恢复暂存区的指定文件到工作区

$ git checkout [file]

(2)恢复某个commit的指定文件到暂存区和工作区

$ git checkout [commit] [file]

(3)恢复暂存区的所有文件到工作区

$ git checkout .

(4)重置暂存区的指定文件,与上一次commit保持一致,但工作区不变

$ git reset [file]

(5)重置暂存区与工作区,与上一次commit保持一致

$ git reset --hard

(6)重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变

$ git reset [commit]

(7)重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致

$ git reset --hard [commit]

(8)重置当前HEAD为指定commit,但保持暂存区和工作区不变

$ git reset --keep [commit]

(9)新建一个commit,用来撤销指定commit

  • 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]

(10)暂时将未提交的变化移除,稍后再移入

$ git stash
$ git stash pop

【10】其他

(1)暂时将未提交的变化移除,稍后再移入

$ git archive

【三】最小配置

  • 在桌面右键点击Git Bash Here进入命令行,GUI我们不常用。

  • 首先要设置你的用户名称和 e-mail 地址

    • 因为每次 Git 提交都会使用该信息
  • 开始配置你的用户名和邮箱

    • 单引号中间随便填你的信息即可,最后用

      git config --system --list
      
    • 查看当前用户配置,该指令显示的就是

    C:\Users\windows.gitconfig 内容(后面再来说这是什么文件)
    

  • ‪指令成功执行后
    • C:\Users\windows.gitconfig会生成一个文件
    • 打开之后就是你刚刚配置的玩意

  • OK配置完基本信息,来讲一下理论知识,然后再开始教大家具体的操作。

【四】Git 工作原理 [ 重要 ]

【1】四大工作区域:

  • Git 本地有三个工作区域:

    • 工作区(Working Directory)

    • 暂存区(Stage/Index)

    • 仓库区 (Repository)

    • 再加上远程的 git 仓库(Remote Directory) 就可以分为四个工作区域

  • 具体说明一下:

    • 工作区:
      • 就是你平时存放代码的地方
    • 暂存区:
      • 用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
    • 仓库区(本地仓库):
      • 就是安全存放数据的位置,这里面有你提交到所有版本的数据
    • 远程仓库:
      • 就是托管代码的服务器(比如 Github/Gitee),也可以简单的认为是一台用于远程数据交换的电脑

一图胜千言:4个区域之间要使用到的指令

需要注意的是,clone的作用类似pull,但是还是有点区别的(我们一般从GitHub上获取别人的代码用的都是clone)

【2】git pull 和 git clone的区别

腾讯云网址:Git教程 git pull 和 git clone的区别-腾讯云开发者社区-腾讯云 (tencent.com)

(1)使用方法

  • 有权限的仓库 本地无代码
    • git pull
    • git clone
  • 有权限的仓库 本地有代码
    • git pull
  • 无权限的仓库 本地无代码
    • git clone
  • 无权限的仓库 本地有代码
    • 删了重新下

换个说法

  • git pull:必须连接远程仓库才能用。可以用于下载完整代码更新本地代码。
  • git clone:只要你想往本地下远程仓库完整的代码就可以用,不用连接远程仓库(连接了也可以)。 不适用于更新本地代码。

如果只想知道怎么用就不用往下看了,如果想知道原因继续看。

(2)git pull

git pull适用于从用户有权限的仓库下拉代码不管本地有没有代码

因为我平时下拉代码都是直接git pull

1.1 我有权限的仓库

我有权限的仓库指的是我自己的,或者团队中我可以使用的仓库。

  • 要使用git pull首先你要确定已经连接远程仓库。
    • 要不然你直接git pull orgin master
    • 那Github会问你:“??什么master?哪个master?你就是老子的master吗?”
  • 所以首先要连接远程仓库。

  1. init初始化空白的本地仓库,里边除了.git啥也没有
  2. 连接远程仓库
1.1.1 本地没代码

  • git remote -v用于显示当前本地仓库连接的远程仓库,你可以连接好几个。
  • 然后一个仓库是成对存在的,一个上传一个下拉。
  • 前边origin我一般称为远程仓库代称,后边的是你的连接方式。
  • 现在显示我连接了一个github的远程仓库取名叫origin。

  • 空白仓库直接使用git pull就可以下拉代码了。
1.1.2 本地有代码

本地有代码是什么情况。

  • 团队合作,一个仓库多人使用

  • 你自己的仓库,你在多台电脑上使用(比如宿舍一个,实验室一个)

  • 为什么要git pull呢?

    • 不同电脑上代码版本不一样。
    • 所以为了减少工作并且保证代码版本一致,要在每次写代码的时候下拉代码。
    • 在写完之后push到远程仓库。
    • 画个图解释一下。

1.2 我没权限的仓库

没权限的仓库指的是别人的仓库。别人不给权限,你当然不能随意修改人家的代码了。

没权限的仓库不能使用git pull

  • 比如:
    • 今天我像往常一样去下载代码。
    • 但是这是我第一次下载别人的代码。

  • 我像往常一样添加仓库链接,git pull下拉。
    • 但是他提示我:

Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rightsand the repository exists.

  • Permission denied是说SSH密钥无法使用,让我确认我是否有权限访问或者这个仓库是不是存在。
    • 仓库确实是存在的。
    • 所以肯定是我没有权限。

解释一下三步操作:

  1. 添加远程仓库,用SSH连接
  2. 从仓库master分支下拉代码
  3. 删除我添加的远程仓库(既然不能用我当然删掉了)
  • 这时候我想起来:SSH只有仓库所有者能用。
    • 因为你电脑上配置的SSH和你github上的SSH是一对的
    • 只有你在你电脑上使用你的github仓库才能用SSH。
  • 既然仓库所有者才能用SSH,那我换HTTP不就行了。
    • (此时我还没意识到问题的严重性?)

  1. 我又添加了https的连接
  2. 第二步我又下拉的仓库

然后他又提示我:

fatal: unable to access ‘https://github.com/hitvoice/DrQA.git/’: OpenSSL SSL_read: Connection was reset, errno 10054

  • 意思还是我无法连接。
    • 这时候我突然意识到了问题?。
    • 这好像是人家的仓库哎,我不能使用remote连接远程仓库之后下拉啊。
    • 因为如果我能连上的话就意味着我能随意修改人家的代码。
    • 所以我肯定不能使用这样的方式pull代码啊!!!
  • 所以得用git clone

(3)git clone

git clone适用于本地没有代码,你要下载。

你连不连接远程仓库都可以,有无仓库权限皆可

  • 接上边的说,意识到使用git clone之后
    • 我删除了刚才的HTTPS连接远程仓库,然后直接git clone
    • 代码成功下载下来了???。

  1. 我删除了上边的https连接远程仓库的方法
  2. git remote -v用于查看你本地仓库都连接了哪些远程仓库,如果连接了会显示仓库代号和连接方式,我这里输出空白,就是没连接任何远程仓库的状态
  3. git clone下载代码成功了。

上边说的是别人的仓库,那如果是我有权限的仓库呢?

  • 新建一个空白的本地仓库。
    • 直接用SSH clone能成功,那HTTPS必定成功。
    • 不用remote能成功,那用了remote也必定成功。
    • (觉得这些稍微会用github的一般不用解释了)

【五】实践

【1】建 Git 仓库

  • 在已经有项⽬代码的文件夹里建Git仓库

    • 在已有的项目代码文件夹处右键

    • 点击Git Bash Here进入命令行输入

      $ git init 
      
    • 然后就会出现一个隐藏的文件夹 .git

  • 在不存在的代码的文件夹中建Git仓库

    • 前面操作相同,指令改成输入

      $ git init [自定义项目名]
      
    • 然后在idea新建项目时使用这个文件夹就好了。

【2】克隆远程仓库

  • 就是将远程服务器上的仓库完全镜像一份至本地,这里我们拿JavaGuide的作为示范

    • 如果我们想要获取到他的开源文件,我们只需要在你想要保存clone下来的文件的地方右键点击

    • Git Bash Here 进入命令行

    • 输入

      $ git clone [URL]
      

  • 随便找个文件夹

    • 我们输入

      $ git clone 加上复制下来他的URL
      
    • 等进度条到100%即可(如果没有魔法的话可能会很慢甚至失败)

【3】文件操作指令

(1)先来介绍文件的4大状态:

  • Untracked:
    • 未跟踪,在文件夹中,,但并没有加入到 git 库,
    • 不参与版本控制,需要通过 git add 状态变为 Staged
  • Unmodify:
    • 未修改,文件已经入库,而且与工作区的内容相同。
      • 如果想要把他移出版本库,可以使用 git rm 移出去不再同步
      • 如果被修改了,就会变成 Modified 已修改状态
  • Modified:
    • 已修改,这种文件有两个去处
      • 可以使用 git add 将其加入暂存区
      • 也可以使用 git checkout 丢弃修改过的内容,返回到刚刚 未修改 的状态(即从库中取出文件,覆盖当前已修改的文件)
  • Staged:
    • 暂存状态,同样,也有两个去处
      • 执行 git commit 则将其同步到库中,此时版本库与工作区一致,变成未修改状态
      • 执行 git reset HEAD filename 取消暂存, 文件状态变为已修改状态

(2)实践一下吧

  • 找到刚刚建好git仓库的文件夹,还是打开git bash here 输入
$ git status [文件名] 
  • 可以先写个几个字母然后按tab键一键补全文件名。
    • 比如说这里就是先写个 s 然后按 tab 就会自动出来 src/ 了

  • 用 git add 加入暂存区

    $ git add .
    

  • 然后就可以开始提交至本地仓库了

  • 使用 git commit -m "自定义一些需要携带的信息"

    $ git commit -m "自定义一些需要携带的信息
    

  • 可以看到如果我们再用 git status 来查看状态的话,会提示没有什么需要提交的了。

【4】忽略文件

  • 实际需求:

    • 我们不想把某些文件纳入版本控制中, 如何处理?
    • 这块内容都是一些配置
  • 具体这个文件在哪呢,一般在idea文件夹下

  • 打开之后可以打开上面的网址对照的文件学一下每一行是什么意思,这里我就不再细说了。

【5】创建自己的远程仓库

  • 这里我们使用GitHub,如果没有魔法也可以使用Gitee
    • 但是Gitee还要实名认证什么的也挺麻烦。
    • 实际两个都差不多操作,这里就用GitHub进行讲解。
  • 首先是打开GitHub官网注册一个自己的账号好吧,这里就是正常注册账号的流程,自己跟着官方指导鼓捣鼓捣就好了。
    • 当然,这里为了照顾一些看到英文就头大的同学,还是贴个教程给你们吧。

注册Github账号详细教程【超详细篇 适合新手入门】-阿里云开发者社区 (aliyun.com)

  • 之后就可以在右上角开始创建我们自己的仓库了,这里借用官方文档的配图

  • 为仓库写一个简短好记的名称

  • 设置为开源还是私有

  • 勾选自动创建readme文件,
    • .gitignore我们一般使用的是Java就用Java类型即可

  • 那么到这里,一个基本的仓库就建好了。

【6】上传文件至远程仓库

  • 这里我就顺便把我目前做的所有笔记上传至GitHub玩一玩好了
  • 首先是把刚刚新建好的仓库clone到本地某个文件夹先

  • 把当前的文件夹和远程仓库绑定 git remote add origin [远程仓库URL地址]

  • 把咱们的笔记放进去之后,输入 git add . 将笔记加入到暂存区

  • 检查一下我们的仓库分支是什么
    • 这个是一开始新建仓库时可以指定的
    • 比如main或者master,刚刚在GitHub建仓库的时候默认是main了

  • 调用push指令将其更新到远程仓库,指令是 git push -u origin [仓库分支]

  • 大功告成

【六】总结:

  • 第一次创建仓库时

【1】clone到本地

git clone [远程仓库URL地址]

【2】把当前的文件夹和远程仓库绑定

git remote add origin [远程仓库URL地址]

【3】更改一系列文件后

git add .  将所有更改后的文件加入到暂存区

【4】调用push指令将其更新到远程仓库

git push origin [仓库分支]

以后再需要更新修改文件只要使用后2个指令即可

  • 有时候会显示这样一句话导致push失败,原因是本地仓库相对于远程仓库不是最新,先pull更新本地,再把自己的push上去
Updates were rejected because the remote contains work that you do

这个时候有两个解决方法

​ 一是强推

​ 二就是pull一下再更新
如果确保本地没问题的话,可直接用强推

git push -f origin [仓库分支]即可

最后,实际情况可能还会有很多原因导致你不能将本地代码推送到仓库中,不过git这方面也没啥太多bug,只需要把报错复制到谷歌上搜一下就有结果了,这里不再赘述太多。

【七】分支与合并

实际开发过程中,有可能一个项目会有多个版本的需求,比如说我们QQ有什么国际版,HD版,精简版之类的。所以这里就需要分支的概念了,分支出来的版本有可能是与主版本平行的永远不会相交,也有可能某一天需要将他与主版本合并。

【1】命令

  • 当然,合并不一定是跟主分支,也可以跟其他分支合并。
  • 列一下指令先,简单看看就好,等会我们再示范一下怎么使用

(1)列出所有本地分支

$ git branch

(2)列出所有远程分支

$ git branch -r

(3)列出所有本地分支和远程分支

$ git branch -a

(4)新建一个本地分支,但依然停留在当前分支

$ git branch [分支名]

(5)切换到该分支

$ git checkout [分支名]

(6)新建一个远程分支,将冒号左右两边的分支绑定,并将本地分支提交至新建的远程分支

$ git push origin 本地分支名:新建的远程分支名

【2】示例

【3】正确的提示

当 Git 无法执行自动合并时,因为更改在同一区域,它会用特殊字符来表示冲突的区域。这些字符序列是这样的:

  • <<<<<<<

  • =======

  • >>>>>>>

  • <<<<<<<=======之间的所有内容都是你的本地修改。

    • 这些修改还没有在远程版本库中。
    • =======>>>>>>>之间的所有行都是来自远程版本库或另一个分支的修改。
    • 现在你需要研究这两个部分并做出决定。
  • 下面的图片显示了一个文件的内容,表明自动合并没有发生,有一个冲突。

    • 冲突发生在我们在本地修改了文件,增加了一行- Sleep
    • 但与此同时,其他人在同一区域添加了 - Gym 行,从而推送了一个修改。
  • 因此,- Sleep行被标记为本地修改,- Gym行被标记为从远程仓库或其他分支传入的修改。

所以这个时候就得去找你的同事扯皮了,到底是用你的sleep还是用他的gym,亦或是新建一行而不是在同一行添加。

【补充】.gitignore文件语法和常见写法

【一】语法

  • 空行会被忽略
  • 匹配是区分大小写的,如:/abc 和 /Abc 含义不同
  • # 开头是注释,会被忽略
  • *表示0-n个字符

  • **两个星含义是子目录子子目录等多层匹配

  • ? 匹配1个字符(注意不是0-1个字符!)

  • [] 用来匹配括号内的任一字符,如 [abc],也可以在括号内加连接符,如

  • [0-9] 匹配0至9的数

  • *~ 忽略所有以~结尾的文件(这种文件通常被许多编辑器标记为临时文件)

  • *.[oa] 忽略所有以".o"或".a"结尾

  • ! 表示不忽略某文件(为什么要特别指出不忽略? 不写规则不就不会被忽略*吗?

    • 这是配合使用的,比如要忽略*.log,但是要排除a.log,这种需求就需要使用!)
  • 匹配规则前面别留空格,会让规则失效。

    • 如 一个空格Ab?.txt 和 Ab?.txt 是有区别的

注意:

  • 空目录(包括隐藏目录)会被忽略,无法提交追踪
  • 如果不希望空目录被忽略,在里头建.gitkeep文件

【二】示例

2.1 前提约定

2.1.1 约定1

“当前目录、子目录、子子目录…” 的表述包含的目录是:

​ .gitignore文件所在的目录,以及该目录下的所有目录和它们的所有子目录及子子目录…

总之是这颗目录树的所有节点。

  • 例如:

  • .gitignore文件在 /Users/stonewang/git-ignore-test/.gitignore

    • .gitignore文件所在的目录为/Users/stonewang/git-ignore-test/
  • 该表述的含义是:以/Users/stonewang/git-ignore-test/作为起点的所有目录树节点

如图:

# 该表述包含了dir1、dir2、dir1_sub、dir1_sub2、dir1_sub_sub、dir1_sub_sub2、dir1_sub2_sub
/Users/stonewang/git-ignore-test/
														|-------.gitignore
														|
														|-------dir1
														|				|----dir1_sub
														|								|-----dir1_sub_sub
														|								|-----dir1_sub_sub2
														|				|----dir1_sub2
														|								|-----dir1_sub2_sub
														|
														|-------dir2
2.1.2 其他补充
  • 目录(即文件夹)的名字有各种表现形式,如显示的、隐藏的、带扩展名的和不带扩展名的。

    • 例如:dir、.dir、dir.ext、.dir.ext
  • 文件名的形式也各种各样,如显示的,隐藏的,带扩展名的,不带扩展名的。

    • 如file、.file、file.ext、.file.ext
  • 在.gitignore中

    • 以 / 结尾的只会匹配目录,不带 / 结尾的匹配文件和目录,注意没有一种写法仅匹配文件的
  • 在Mac和Windows中都不允许文件之间重名,目录之间重名,目录和文件之间重名。不区分大小写

  • 在Mac和Windows中,目录名都是允许带点的,如dir.ext 可以作为目录名(看起来就像文件的扩展名)

2.2 例子(着重看)

  • 为了表述准确,引入自创数学符号
    • (.gitignore)N 表示.gitignore文件所在的目录+所有子目录包括直接或间接
    • (.gitignore)O 表示.gitignore文件所在的目录,不包括其任何子目录
写法 作用
dir/ 忽略 (.gitignore)N 中的dir目录
/dir/ 忽略 (.gitignore)O 中的dir目录
file 忽略(.gitignore)N 中的file 文件&目录(名为file的目录也会被忽略)
/file 忽略(.gitignore)O 中的file文件
*.log 忽略(.gitignore)N 中的*.log 文件&目录(符合名字的目录也将被忽略)
/dir/file 忽略(.gitignore)O 中的dir目录下的file文件
/dir/Abc* 和 /dir/Abc.java 和/dir/.java 忽略(.gitignore)O 中的dir目录下符合Abc(或Abc.java或*.java)规则的文件&目录
/dir/Abc*/ 忽略(.gitignore)O 中的dir目录下符合Abc*的目录(不忽略dir下的文件!)
/dir/*/ 忽略(.gitignore)O 中的dir目录下的符合*的子目录(注意/sub/file的文件不会忽略)
/dir//.txt 忽略(.gitignore)O 中的dir目录下的符合的子目录下的,符合.txt的文件&目录。注意是一个星,仅忽略一层,即/dir/sub/a.txt 和 /dir/sub/sub2/b.txt,仅仅忽略a.txt,不忽略b.txt,另外/dir/k.txt也不会被忽略
/dir/**/*.txt 忽略 (.gitignore)O 中的dir目录下的直接和间接子目录下的,符合*.txt的文件&目录。两个星号表示0-n层级的目录
/sub/** 和 /sub/ 是等价的 亲测。前者表示忽略/sub/下的所有直接或间接的目录和文件(**表示文件和目录,因为没有/结尾),后者表示忽略/sub/下的东西
/sub/**/ 和 /sub/ 是不等价的 亲测。前者明确表示忽略目录除掉了文件,所以对于/sub/file是不会被忽略的。
sub/ 和 /sub/ 含义不同 前者忽略(.gitignore)N下的sub目录,后者忽略(.gitignore)O下的sub
sub/abc/ 和 /sub/abc/ 这两个的含义完全相同(有点奇怪,本以为前者是递归所有的目录)
**/src/main/java/ 和 src/main/java/ 不等价。前者匹配(.gitignore)N下的src/main/java/ 目录,要满足这个目录的层级结构的。后者等价于/src/main/java/,仅仅忽略(.gitignore)O下的该目录
**/src/main/file.txt 和 src/main/file.txt 不等价。前者匹配(.gitignore)N下的src/main/file.txt,符合这个目录层级结构的将会被忽略,后者等价于/src/main/file.txt,仅仅忽略(.gitignore)O下所匹配的
**/dir/ 和 dir/ 是等价的。上面的例子等价这个不等价,就是因为目录的层级数的问题导致的
**/file.txt 和 file.txt 是等价的。
先后写!a.txt和*.txt 后面的配置覆盖前面的,导致所有*.txt文件都被忽略(有点奇怪,实际测试确实如此)
先后写*.txt 和 !a.txt 正确。能够忽略除了a.txt外的文件。
对于.gitignore文件不在git仓库根目录的情况:参考特殊情况 (参考特殊情况)
  • 特殊情况
# 对于.gitignore文件并非和git仓库根目录相同目录,如下所示,git仓库根目录即.git所在的目录,跟.gitignore目录并非相同
# /sub2       忽略的是sub/sub2,并不是git根目录的那个sub2
# sub2				忽略的也是sub/sub2,也就是说.gitignore的写法只能管该文件所在的目录及其子目录和子子目录...,其父目录管不着

|---.git
|---a.txt
|---sub
|			|----.gitignore
|	 		|----b.txt
|	 		|----sub_sub
|	 		|   	|-----c.txt	
|   	|----sub2
|   				|-----test.txt		
|---sub2
	 |----x.txt
	 |----sub2_sub
	 					|------y.txt

【补充】注册github账号

参考网址:注册Github账号详细教程【超详细篇 适合新手入门】-阿里云开发者社区 (aliyun.com)

【一】GitHub的简介****

1、大概介绍

GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。

2、详细介绍

【二】、如何注册自己的GitHub账户

1、进入github的官网

(github.com)

2、点击右上角注册按钮sign up,来到注册页面

3、在光标处输入自己的邮箱,邮箱必须是可以收到邮件的。

4、点击Continue,继续在光标处创建密码,继续创建用户名

5、进行相应的验证,点击 create account 后 ,会出现这个界面

6、这时邮箱就会收到一封邮件,输入邮件中的数字页面会自动跳转

7、根据自身情况进行相应个性化设置

8、到这个界面时,GitHub便创建好了

9、下次登录时,需要点击旁边的sign in,进入登录页面

【三】、Github的基本功能介绍

  • GitHub于2008年4月10日正式上线,除了Git代码仓库托管及基本的Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。
  • 作为开源代码库以及版本控制系统,Github拥有超过900万开发者用户。
    • 随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法。
  • 如前所述,作为一个分布式的版本控制系统,在Git中并不存在主库这样的概念,每一份复制出的库都可以独立使用,任何两个库之间的不一致之处都可以进行合并。
  • GitHub可以托管各种git库,并提供一个web界面,但它与外国的SourceForge、Google Code或中国的coding的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性。
    • 为一个项目贡献代码非常简单:
      • 首先点击项目站点的“fork”的按钮,
      • 然后将代码检出并将修改加入到刚才分出的代码库中,
      • 最后通过内建的“pull request”机制向项目负责人申请代码合并。
    • 已经有人将GitHub称为代码玩家的MySpace。
  • 在GitHub进行分支就像在Myspace(或Facebook)进行交友一样,在社会关系图的节点中不断的连线。
  • GitHub项目本身自然而然的也在GitHub上进行托管,只不过在一个私有的,公共视图不可见的库中。
    • 开源项目可以免费托管,但私有库则并不如此。
    • Chris Wanstrath,GitHub的开发者之一,肯定了通过付费的私有库来在财务上支持免费库的托管这一计划。
  • 通过与客户的接洽,开发FamSpam,甚至是开发GitHub本身,GitHub的私有库已经被证明了物有所值。
    • 任何希望节省时间并希望和团队其它成员一样远离页面频繁转换之苦的人士都会从GitHub中获得他们真正想要的价值。
  • 在GitHub,用户可以十分轻易地找到海量的开源代码。