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 装在什么目录,就以此作为根目录来定位。
git --version
查看git版本
git config --global user.name "xxx"
配置个人的用户名称
git config --global user.email xxx@xxx.com
配置个人的电子邮件地址
如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
git config --global core.editor emacs
设置Git默认使用的文本编辑器, 一般可能会是 Vi 或者 Vim
git config --global merge.tool vimdiff
在解决合并冲突时使用哪种差异分析工具, 比如要改用 vimdiff 的话
Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。
git config --list
检查已有的配置信息
有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。这些配置我们也可以在 ~/.gitconfig 或 /etc/gitconfig 看到
vim ~/.gitconfig
git config user.name
直接查阅某个环境变量的设定,只要把特定的名字跟在后面
Git 工作流程
一般工作流程:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
图示:
Git 工作区、暂存区和版本库
Git 工作区、暂存区和版本库概念:
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫stage或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
图示:
图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage, index),标记为 “master” 的是 master 分支所代表的目录树。
图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
图中的 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 init
初始化一个 Git 仓库, git init 是使用 Git 的第一个命令
在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。
git init newrepo
会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中
# 目录下以 .c 结尾及 README 文件提交到仓库中。
git add *.c
git add README
git commit -m '初始化项目版本'
git clone <repo>
从现有 Git 仓库中拷贝项目(类似 svn checkout)
git clone <repo> <directory>
克隆到指定的目录
git clone git@github.com:git-yangmeng/Dress.git
克隆Dress到本地仓库
git clone git@github.com:git-yangmeng/Dress.git MyDress
克隆Dress到本地仓库并重命名
执行该命令后,会在当前目录下创建一个名为Dress的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录。
git clone 时,可以所用不同的协议,包括 ssh, git, https 等,其中最常用的是 ssh,因为速度较快,还可以配置公钥免输入密码
git clone git@github.com:git-yangmeng/Dress.git --SSH协议
git clone git://github.com/git-yangmeng/Dress.git --GIT协议
git clone https://github.com/git-yangmeng/Dress.git --HTTPS协议
Git 基本操作
获取与创建项目命令
git init
目录中创建新的 Git 仓库,可以在任何时候、任何目录中这么做,完全是本地化的。
git clone <repo>
拷贝一个 Git 仓库到本地
基本快照
git add <file/dir> ...
将文件添加到缓存
git status
查看项目下文件的当前状态,详细输出
git status -s
查看项目下文件的当前状态,简短输出(A:新增 M:修改 D:删除)
git diff <source_branch> <target_branch>
来查看执行 git status 的结果的详细信息, 显示已写入缓存与已修改但尚未写入缓存的改动的区别
- 尚未缓存的改动:git diff
- 查看已缓存的改动: git diff --cached
- 查看已缓存的与未缓存的所有改动:git diff HEAD(master)
- 显示摘要而非整个 diff:git diff --stat
git status 显示你上次提交更新后的更改或者写入缓存的改动, 而 git diff 一行一行地显示这些改动具体是啥
git commit <-m> <Annotation>
将缓存区内容添加到仓库中 , -m 选项以在命令行中提供提交注释
Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址
git commit -a
如果你觉得 git add 提交缓存的流程太过繁琐,Git 也允许你用 -a 选项跳过这一步
git reset HEAD
用于取消已缓存的内容,取消之前 git add 添加,但不希望包含在下一提交快照中的缓存
git rm <file>
从 Git 中移除某个文件
git rm -f <file>
删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
git rm --cached <file>
如果把文件从暂存区域移除,但仍然希望保留在当前工作目录中,仅是从跟踪清单中删除
git rm –r *
递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件
git mv
用于移动或重命名一个文件、目录、软连接。
git commit、git push、git pull、 git fetch、git merge 的含义与区别:
git commit
:是将本地修改过的文件提交到本地库中;git push
:是将本地库中的最新信息发送给远程库;git pull
:是从远程获取最新版本到本地,并自动merge;git pull = git fetch + git merge
git fetch
:是从远程获取最新版本到本地,不会自动merge;git merge
:是用于从指定的commit(s)合并到当前分支,用来合并两个分支;git merge -b
// 指将 b 分支合并到当前分支
图解GIt :https://www.runoob.com/w3cnote/git-graphical.html
Git 分支管理
git branch (branchname)
创建分支命令
git checkout (branchname)
切换分支命令
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录
git merge
合并分支命令
可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支
git branch
没有参数时,git branch 会列出你在本地的分支
git checkout -b (branchname)
创建新分支并立即切换到该分支下,从而在该分支中操作
git branch -d (branchname)
删除分支命令
git merge
分支合并
合并冲突
合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。
在master, feature_x 分支中分别修改b.txt ,并 git commit -am “”, 合并时则会出现以下冲突:
手动修改冲突
用 git add 要告诉 Git 文件冲突已经解决
git commit 提交后删除 分支
Git 查看提交历史
git log
回顾提交历史
git log --oneline
用 --oneline 选项来查看历史记录的简洁的版本
git log --graph
--graph 选项,查看历史中什么时候出现了分支、合并
git log --oneline --graph
git log --reverse
--reverse参数来逆向显示所有日志
git log --author=<yangmeng>
查找指定用户的提交日志可以使用命令
git log --author=yangmeng --oneline -5
要指定日期,可以执行几个选项:–since 和 --before,但是你也可以用 --until 和 --after
git log --oneline --before={3.weeks.ago} --after={2020-05-18} --no-merges
查看 Git 项目中三周前且在四月十八日之后的所有提交, 用–no-merges 选项以隐藏合并提交
Git 标签
如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。
git tag -a v1.0
-a 选项意为"创建一个带注解的标签"
注意当执行 git log --decorate 时,可以看到标签
git tag -a v0.9 85fc7e7
忘了给某个提交打标签,又将它发布了,可以给它追加标签
git tag
查看所有标签
git tag -a <tagname> -m "指定标签信息"
指定标签信息命令
git tag -s <tagname> -m "PGP标签"
PGP签名标签命令(PGP签名的标签是不可以伪造的)
git show 0.0.9
查看标签版本信息
Git 远程仓库(Github)
本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息:
ssh-keygen -t rsa -C "youremail@example.com"
your_email@youremail.com 改为你在 Github 上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行
成功的话会在 ~/ 下生成 .ssh 文件夹,进去,打开 id_rsa.pub,复制里面的 key。
回到 github 上,进入 Account => Settings(账户配置)。
左边选择 SSH and GPG keys,然后点击 New SSH key 按钮,title 设置标题,可以随便填,粘贴在你电脑上生成的 key。
为了验证是否成功,输入以下命令:
ssh -T git@github.com
拉取,推送到远程仓库
git fetch origin master
从名为 origin 的远程上拉取名为 master 的分支到本地分支 origin/master 中
git push [alias] [branch]
将你的 [branch] 分支推送成为 [alias] 远程仓库上的 [branch] 分支
git push origin master
推送到 Github : 推送本地的 master 分支到远程 origin
删除远程仓库
git remote -v
查看仓库
git remote add origin2 git@github.com:git-yangmeng/test.git
添加仓库 origin2
git remote rm origin2
删除仓库 origin2
实用命令
gitk
内建的图形化 git
git config color.ui true
彩色的 git 输出
git config format.pretty oneline
显示历史记录时,每个提交的信息只显示一行
git add -i
交互式添加文件到暂存区