git-学习git,这一篇就足够了(初学者视角实战教程)

简介: git-学习git,这一篇就足够了(初学者视角实战教程)

git概念

命令

usage: git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]
These are common Git commands used in various situations:
start a working area (see also: git help tutorial)
   clone      Clone a repository into a new directory
   init       Create an empty Git repository or reinitialize an existing one
work on the current change (see also: git help everyday)
   add        Add file contents to the index
   mv         Move or rename a file, a directory, or a symlink
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index
examine the history and state (see also: git help revisions)
   bisect     Use binary search to find the commit that introduced a bug
   grep       Print lines matching a pattern
   log        Show commit logs
   show       Show various types of objects
   status     Show the working tree status
grow, mark and tweak your common history
   branch     List, create, or delete branches
   checkout   Switch branches or restore working tree files
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   merge      Join two or more development histories together
   rebase     Reapply commits on top of another base tip
   tag        Create, list, delete or verify a tag object signed with GPG
collaborate (see also: git help workflows)
   fetch      Download objects and refs from another repository
   pull       Fetch from and integrate with another repository or a local branch
   push       Update remote refs along with associated objects

常用命令

  • clone
  • add
  • commit
  • pull
  • push
  • status
  • remote
  • branch
  • diff
  • merge
  • rebase
  • tag

git配置

Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
    在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是 C:\Documents and Settings\$USER。

此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。

README

项目的描述文件,例如,包含作者信息,组织信息,安装方法,使用说明等

.gitignore

忽略文件或目录,不上传到远程仓库。

工作区、暂存区和版本库

  • 工作区:就是在电脑里能看到的目录。
  • 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

    图片来源:https://www.runoob.com/git/git-workspace-index-repo.html

基础

配置

例如,配置用户名和邮箱

git config --global user.name "FrankYu"
git config --global user.email yubo112058@sina.com

创建远程仓库

这里在gitee创建的远程仓库

克隆

git clone https://gitee.com/frankyu365/learngit.git

learngit目录下内容如下

.git目录中内容如下

修改

添加src目录

使用pycharm打开目录,添加源代码,虚拟环境

查看工作区当前状态

git status

添加到暂存区

git add .

回退版本

git reset HEAD

我们发现git add添加.idea下面的文件到缓存区了,我们并不需要

之后运行

git add .\src\main.py

比较工作区与缓存区的差异

git diff --cached

确认我们更改了main.py

添加到本地仓库并加注释

git commit -m 'add main.py'

push

git push

查看远程仓库

可以看到仅添加了main.py,没有.idea目录。如果只是个人使用,项目不复杂,只会前面的操作基本就可以了。如果多人合作,项目比较大,就涉及到版本管理、权限控制、分支管理、冲突解决等问题。

提高

git毕竟是多人合作的,所以还要考虑冲突、权限、分支管理等

git pull

查看status

现在,修改远程仓库的.gitignore文件,模拟其他合作者修改后push到远程仓库的情况

之后,我们运行一下命令

git pull

可以看到拉取了修改,status已经不显示了

文件删除与恢复

我们先创建一个nothing.txt文件

之后,我们在本地(工作区)删除

假设我们是不小心删除的,现在工作区没有了,如何找回呢?

git checkout -- nothing.txt

现在我就是想要删除它,该如何做呢?

git rm nothing.txt
git commit -m 'delete nothing.txt'

现在还可以从远程仓库找到该文件,我们再运行

git push

就可以删除了

分支管理

列出分支

git branch

默认是只有master分支的。查看远程仓库的分支,添加-r选项

git branch -r

创建分支

git branch test

可以看到有两个分支,所在的分支前面有个*

切换分支

git checkout test

分支操作

在创建分支的情况下,push到远程仓库

git push origin test

假设我是测试人员,只修改test分支,那么如何克隆某一个分支呢?

git clone --single-branch --branch test https://gitee.com/frankyu365/learngit.git

修改main.py,其他操作都是一样的。

现在本地有两个clone,一个是单分支test,与远程仓库一致,一个是双分支,test分支与远程仓库不一致。

git pull origin test:test

这时你会发现,两个分支的内容不一样,切换分支时,目录下的文件也会改变。

标签管理

标签与commit挂钩,类似一个别名

创建标签

git tag -a v1.0 -m "version 1.0 released"

-a后加标签 -m后加注释

注意:默认将标签打到最新的commit上,需要在之前的commit上打标签,可以后面加上commit id,commit id获取可以看日志部分,

查看标签

标签列表

git tag

标签信息

git show v1.0

推送标签到远程

git push origin v1.0

删除标签

本地删除

git tag -d v1.0

远程删除

git push origin :refs/tags/v1.0

日志

git log

冲突与解决

单分支多人合作冲突与解决

总有朋友学习git的时候认为修改同一个文件会出冲突,其实不是的

远程修改main.py 并提交

本地修改main.py

本地 git push

可以看到被拒绝了,请先fetch,也就是获取(git pull),因为远程仓库有本地没有的修改

之后,我们git pull

可以看到已经自动merge 了

看本地文件内容,可以看到git很聪明的将远程和本地的内容合并到了一起,我们再次push

可以看到成功了,远程仓库也有了。

那么为什么有的朋友几个人修改一个分支还会有冲突呢?

我们修改远程的代码并提交

之后可以看到commit id

修改本地文件的同一行内容

git push发现和之前一样,但是git pull后却发现自动merge失败,出现了冲突!!!

查看文件,可以看到增加了很多内容

每个冲突地方的格式如下:

<<<<<<< HEAD
本地工作区内容
=======
远程仓库内容
>>>>>>> 远程仓库提交时的commit id

可以看到修改同一个文件的同一行时会出现冲突,因为git不知道到底需要保留哪一个。这个时候就需要你们自行商量,解决后再push。具体如何做呢?

我们终止merge,因为无法自动merge,然后再次pull

git merge --abort
git pull --rebase

可以看到一些提示,手动解决冲突后,在git add/rm,然后git rebase --continue。之后就正常了。此时查看git status也是差不多的提示。

git push时注意,没有在分支上,push后再切换回分支即可。

可以看到已经正常了

同分支git push出现问题解决步骤:

  1. git push 后发现reject问题
  2. git pull 看看能否自动merge,如果可以,就不用管了,说明修改的不同文件或同一文件的不同行
  3. git merge --abort 放弃merge
  4. git pull --rebase
  5. git add/rm 手动解决冲突后add或rm
  6. git rebase --continue 无需commit,直接 git rebase即可
  7. git push

分支合并冲突与解决

创建test分支后,修改了master分支,一般都是把其他分支合并到master分支,我们先制造冲突

修改test分支

切换test并pull下来

在master分支合并

发现冲突,解决后add,commit,push即可

push结果如下:

总结如下:

  1. 一个分支修改(如test、dev、feature等)
  2. 修改完后切换到想要合并的分支(如master),使用git merge xxx来合并
  3. 如果没冲突,push即可
  4. 手动修改冲突文件
  5. git add 冲突的文件
  6. git commit
  7. git push
    在公司一般会用pull request,并设置审查人员,也能够看到是否有冲突

常见问题

.gitignore失效问题

如果某文件已在远程仓库中,想忽略后续更改,.gitignore不生效,需要git add时忽略。

如果此文件不需要在远程仓库中,可以git rm --cached <文件路径>后添加到.gitignore。

不冲突/单分支冲突/合并冲突的情况有哪些?

1.单分支修改同一个文件的不同行不会发生冲突

2.单分支修改同一个文件的相同行会发生冲突

3.当文件行数 只有 2 行时,不同分支修改同一个文件的相同行会发生合并冲突

4.当文件行数 只有 2 行时,不同分支修改同一个文件的不同行会发生合并冲突

4.当文件行数 大于 2 行时,不同分支修改同一个文件的不相同且非相邻行不会发生合并冲突

5.当文件行数 大于 2 行时,不同分支修改同一个文件的相同或相邻行会发生合并冲突

如何克隆克隆单条分支?

git clone --single-branch <仓库URL> <本地目录> --branch <分支名>

克隆单分支可以减少空间

更多问题欢迎在评论区评论!!!

参考

git-windows安装包

git-scm.com

git书籍

相关文章
|
6天前
|
存储 开发工具 git
git工具使用教程全讲解
本文介绍了版本控制的概念及其重要性,详细对比了多种版本控制工具,如VSS、CVS、SVN和Git,重点讲解了Git的基本使用方法、工作原理及与SVN的区别。此外,文章还介绍了GitHub、GitLab和Gitee等流行的代码托管平台,以及如何在这些平台上注册账号、创建和管理仓库。最后,文章还提供了如何在IntelliJ IDEA中配置和使用Git的具体步骤。
23 1
|
1月前
|
开发工具 git
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
这篇文章是关于Git常用命令的总结,包括初始化配置、基本提交、分支操作、合并、压缩历史、推送和拉取远程仓库等操作的详细说明。
102 1
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
|
1月前
|
Shell 开发工具 git
git学习三:git使用:删除仓库,删除仓库内文件
通过GitHub的设置页面删除仓库,以及如何使用Git命令行删除仓库中的文件或文件夹。
130 1
git学习三:git使用:删除仓库,删除仓库内文件
|
1月前
|
编译器 开发工具 数据安全/隐私保护
Git——多人协作/版本控制,在一个gitee仓库下开发(Gitee版教程)手把手教学,包好用的!
本文提供了一个关于如何在Gitee上进行多人协作和版本控制的详细教程,包括新建和初始化仓库、克隆仓库、邀请好友共同管理仓库以及注意事项,旨在帮助用户顺利进行代码协作开发。
127 0
Git——多人协作/版本控制,在一个gitee仓库下开发(Gitee版教程)手把手教学,包好用的!
|
28天前
|
Unix Shell 网络安全
git学习六:(bug总结)git@github.com: Permission denied (publickey).等
本文是关于解决在使用Git和GitHub时遇到的“git@github.com: Permission denied (publickey)”错误的指南。文章提供了详细的步骤,包括确认SSH Agent运行状态、检查密钥配置、确保密钥匹配、验证仓库URL、检查权限和代理设置,以及配置SSH文件。这些步骤帮助用户诊断并解决SSH认证问题。
70 0
|
1月前
|
Linux 开发工具 git
企业级Git管理工作流分析--GIT实战详解
企业级Git管理工作流分析--GIT实战详解
32 0
|
1月前
|
编译器 网络安全 开发工具
git学习五:切换本地仓库出现的问题。修改git配置初始化。error:src refspec master does not match any。错误总结,送上几个案例
这篇文章是关于Git使用中遇到的一些问题及其解决方案的总结,包括切换本地仓库时的问题、修改Git初始化配置、以及解决"error: src refspec master does not match any"错误等。
50 0
|
3月前
|
开发工具 git
Git 高手之路:高级特性与实战技巧揭秘
【8月更文第16天】在日常开发工作中,Git 已成为版本控制不可或缺的工具。本文将介绍 Git 的一些高级特性和实战技巧,帮助你更好地管理项目和团队协作。
39 1
|
3月前
|
Linux 开发工具 git
|
4月前
|
数据可视化 程序员 开发工具
小白也能玩转Git:从入门到实战详细教程
小白也能玩转Git:从入门到实战详细教程