入职一个月的Git备忘录

138 阅读4分钟

Git

Git直接记录快照,而非比较差异。

Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。

Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流。

Git快照.png

Git安装配置

配置个人的用户名称和电子邮件地址:

$ git config --global user.name "runoob"
$ git config --global user.email test@runoob.com

如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。

如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。

查看配置信息

要检查已有的配置信息,可以使用 git config --list 命令:

$ git config --list
http.postbuffer=2M
user.name=runoob
user.email=test@runoob.com

Git 工作流程

一般工作流程如下:

1. 克隆 Git 资源作为工作目录。

2. 在克隆的资源上添加或修改文件。

3. 如果其他人修改了,你可以更新资源。

4. 在提交前查看修改。

5. 提交修改。

6. 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

Git工作流程.png

Git 工作区、暂存区和版本库

 工作区: 就是你在电脑里能看到的目录。

 暂存区: 英文叫 stage 或 index。一般存放在  .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

 版本库: 工作区有一个隐藏目录  .git,这个不算工作区,而是 Git 的版本库。 image.png 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。

图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。(head指向当前所在的本地分支)

图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。

当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

当执行 git rm --cached  命令时,会直接从暂存区删除文件,工作区则不做出改变。

当执行 git checkout .  或者 git checkout --  命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。

当执行 git checkout HEAD .  或者 git checkout HEAD  命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

Git 创建仓库

Git 使用git init命令来初始化一个 Git 仓库

在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变

使用当前目录作为 Git 仓库,我们只需git init使它初始化。 该命令执行完后会在当前目录生成一个 .git 目录, 使用我们指定目录作为Git仓库。

    git init newrepo

初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。

如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:

$ git add *.c

$ git add README

$ git commit -m '初始化项目版本'

以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。

Git 基本操作

Git基本操作.png 一个简单的操作步骤:

 git init - 初始化仓库。
 git add . - 添加文件到暂存区。
 git commit -提交暂存区到本地仓库。
git clone拷贝一份远程仓库,也就是下载一个项目。
git remote远程仓库操作
git fetch从远程获取代码库
git pull下载远程代码并合并
git push上传远程代码并合并

Git 分支管理

image.png 创建分支命令:

git branch (branchname)

切换分支命令:

git checkout (branchname)

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。 合并分支命令:

git merge
git checkout (branch) 切换到我们要修改的分支
git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下,从而在该分支中操作。

删除分支命令:

 git branch -d (branchname)

Git远程仓库

image.png

添加远程仓库

1. 创建远程仓库(在gitee/github新建仓库)

2. 连接远程仓库 $ git remote add origin <git@github.com:自己的GitHub账户名/自己的仓库名.git>

下一步,就可以把本地库的所有内容推送到远程库上$ git push -u origin master

Git 有两个命令用来提取远程仓库的更新。

1、从远程仓库下载新分支与数据: git fetch

该命令执行完后需要执行 git merge 远程分支到你所在的分支。

2、从远端仓库提取数据并尝试合并到当前分支:git merge

该命令就是在执行 git fetch 之后紧接着执行 git merge 远程分支到你所在的任意分支

 

查看远程库信息:
git remote -v

QQ截图20221102112746.png

推送你的新分支与数据到某个远端仓库命令:
git push [alias] [branch]

Git命令总结

git branch 查看本地所有分支  
git status 查看当前状态   
git commit 提交   
git branch -a 查看所有的分支  
git branch -r 查看远程所有分支  
git commit -am "init" 提交并且加注释   
git remote add origin git@192.168.1.119:ndshow  
git push origin master 将文件给推到服务器上   
git remote show origin 显示远程库origin里的资源   
git push origin master:develop  
git push origin master:hb-dev 将本地库与服务器上的库进行关联   
git checkout --track origin/dev 切换到远程dev分支  
git branch -D master develop 删除本地库develop  
git checkout -b dev 建立一个新的本地分支dev  
git merge origin/dev 将分支dev与当前分支进行合并  
git checkout dev 切换到本地dev分支  
git remote show 查看远程库  
git add .  
git rm 文件名(包括路径) 从git中删除指定文件  
git clone git://![]()github.com/schacon/grit.git 从服务器上将代码给拉下来  
git config --list 看所有用户  
git ls-files 看已经被提交的  
git rm [file name] 删除一个文件  
git commit -a 提交当前repos的所有的改变  
git add [file name] 添加一个文件到git index  
git commit -v 当你用-v参数的时候可以看commit的差异  
git commit -m "This is the message describing the commit" 添加commit信息  
git commit -a -a是代表add,把所有的change加到git index里然后再commit  
git commit -a -v 一般提交命令  
git log 看你commit的日志  
git diff 查看尚未暂存的更新  
git rm a.a 移除文件(从暂存区和工作区中删除)  
git rm --cached a.a 移除文件(只从暂存区中删除)  
git commit -m "remove" 移除文件(从Git中删除)  
git rm -f a.a 强行移除修改后文件(从暂存区和工作区中删除)  
git diff --cached 或 $ git diff --staged 查看尚未提交的更新  
git stash push 将文件给push到一个临时空间中  
git stash pop 将文件从临时空间pop下来