git 笔记

名词
  • Workspace 工作区
    就是工作需要进行增加修改删除操作的目录,比如目录下testgit里的文件(.git隐藏目录版本库除外)。

  • Index/Stage 暂存区
    又叫缓存区

  • Repository本地仓库
    工作区有一个隐藏目录.git,这个不属于工作区,这是版本库。其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。

  • Remote 远程仓库

  • master 默认开发分支

  • origin 默认远程版本库

开始使用git

安装好Git后,配置用户名和用户邮箱,以后每次与Git的交互都会使用该信息。
your_name可以不跟github用户名一样

git config --global user.name "your_name"  
git config --global user.email "your_email@gmail.com"

配置信息想要更改使用上面指令就可以。同时可以使用git config --list指令查看Git的配置信息。Git默认是大小写不敏感的,也就是说,将一个文件名某个字母做了大小写转换的修改Git是忽略这个改动的,导致在同步代码时候会出现错误,所以建议大小把Git设置成大小写敏感。

git config core.ignorecase false

生成密钥
Git关联远程仓库时候需要提供公钥,本地保存私钥,每次与远程仓库交互时候,远程仓库会用公钥来验证交互者身份。使用以下指令生成密钥。
ssh-keygen -t rsa -C "your_email@youremail.com"

生成密钥后,在本地的/Users/当前电脑用户/.ssh目录下会生成两个文件id_rsaid_rsa.pubid_rsa文件保存的是私钥,保存于本地,id_rsa.pub文件保存的是公钥,需要将里面内容上传到远程仓库。

查看你的public key
cat ~/.ssh/id_rsa.pub

远程仓库添加密钥
以GitHub为例子,向远程仓库添加公钥,上面已经获取到了公钥,只需要将公钥添加到远程仓库就可以了。
在个人设置页面,左边选中SSH and GPG keys,在右边添加公钥,title是key的名称,可以随便取,可更改,key是上面我们获取到的公钥,填写完毕后点击add SSH key按钮,这样远程就添加到了密钥。

添加后,在终端(Terminal)中输入
ssh -T git@github.com
若返回:Welcome to Gitee.com, 你的name!,则配置成功。
若提示不正确错误:Are you sure you want to continue connecting (yes/no)?
输入yes继续回车就可以了。
然后在重复输入ssh -T git@gitee.com,回车则会提示正确。


本地新建仓库关联到远程
  1. 首先在github上创建个空项目,得到仓库的链接 (例如: https://github.com/xxx/xxx.git)
  2. 在本地文件夹下面执行终端命令git init,初始化文件夹,作为本地的一个仓库。
  3. 执行git remote add origin 仓库的链接
  4. 执行git pull指令, 将远程代码拉取到本地(本地仓库里的文件不会被删掉, 不拉取,直接push会报错), 执行完毕后,远程仓库代码已经同步到了本地。
  5. 执行git push -u origin master,推送到远程仓库master分支

例子:

# 先在github上创建空项目, 仓库的链接 https://github.com/xxx/testGit.git
cd ~/testGit # 本地创建的项目名称文件夹 testGit
git init # 初始化为git仓库
git add . # 当前目录使用文件添加到暂存区
git commit -m  "first commit" # 暂存区提交到本地仓库
git remote add origin https://github.com/xxx/testGit.git # 关联到远程仓库
git pull # 拉取远程仓库文件
git push -u origin master # 推送本地仓库文件和记录到远程仓库

clone远程项目

终端 进入准备放项目代码文件夹:
#cd ~/testGit
回车输入以下命令
git clone https://github.com/xxx/testGit.git


IDEA中本地新建项目托管到github或gitee
  1. IDEA 配置–> setting–>Version Control ->Git 配置Path to Git exectable 选择可执行的git程序
  2. idea 中新建一个项目
  3. 终端执行以下命令:
	git init
	git add .
	git commit -m  "first commit"
	git remote add origin https://github.com/xxx/xxx.git
	git push  -u origin master
  1. 如果不出错误提示输入用户名, 密码:
    Username for 'https://github.com':

配置

Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。

  • 显示所有配置信息
    git config --list

  • 编辑git配置文件
    git configuration -e [--global]

  • 初始化配置

    # 设置提交代码时的用户名和邮箱
    #用户名可以不和github的用户名一样
    git config --global user.name “Your Name” 
    git config --global user.email "email@163.com"
    	
    # 设置大小写敏感
    git config core.ignorecase false 
    
  • 移除全局设置
    git config --global --unset <entry-name>

  • 给 git 命令起别名

    git config --global alias.<handle> <command>
    比如:git status 改成 git st,这样可以简化命令
    git config --global alias.st status
    

创建项目

init命令
git init:在本地初始化一个git仓库

clone命令
git clone <项目URL>: 从远程服务器克隆一个仓库到本地

基本操作

add命令
git add <file>:添加工作目录的文件到暂存区

status命令
git status:显示工作树的状态,一般有三种状态

  • Untracked files:未被跟踪的文件,表示是工作目录新增加的文件
  • Changes not staged for commit:工作目录中修改了文件,但是没有被添加到暂存区
  • Changes to be committed:添加到暂存区的文件,等待提交

commit命令
git commit -m "提交消息":提交暂存区的文件到本地仓库,带有提交消息
git commit -a -m "提交消息":跳过暂存区,直接提交工作目录中所有改变的文件到本地仓库,但是不能提交工作目录中新增的文件
git commit --author=haha -m "提交消息":提交暂存区的文件到本地仓库,并重写提交作者
git commit --date=08.13.2019T09:00:00 -m "提交消息":提交暂存区的文件到本地仓库,并重写提交日期
git commit --amend -m "提交消息":通过创建一个新的提交,以替换当前分支的上次的提交。如果你不满意上次的提交,可以修改掉之前写的日志。或者你提交以后,发现自己漏掉了一些东西,但是你不想多产生一次记录。已push到线上的记录不要使用这个命令去修改

reset命令
git reset:重置暂存区为当前分支的HEAD(最近一次提交),工作目录不会发生变化
git reset <commit> <file>:重置暂存区的指定文件到指定的(可以是commit的hash也可以是HEAD及其祖先,HEAD~1表示HEAD的父亲,是HEAD的前一次提交,没有时默认是HEAD)。
git reset [--hard|soft|mixed|merge|keep] [<commit>]:将当前分支重设到指定的,并且根据mode有可能更新暂存区和工作目录。mode的取值可以是hard、soft、mixed、merged、keep。

  • hard:重置暂存区与工作目录到指定提交,删除之后的所有提交并将HEAD指向该提交,此操作危险指数较大(应慎用)
  • soft:暂存区与工作目录不会变化,仅仅删除之后的所有提交并将HEAD指向该提交
  • mixed:默认的,重置暂存区到指定提交,删除之后的所有提交并将HEAD指向该提交

git checkout -- <file>:撤销工作目录的修改。使用该命令撤销的修改不能恢复。

HEAD是指向当前分支引用的指针,该指针指向在该分支上的最后一个提交的指针。这意味着HEAD将是下一个创建的提交的父亲。一般来说,把你的HEAD作为你最后一次提交的快照,是最简单的。HEAD~1表示HEAD的前一次提交,HEAD~2表示HEAD的前两次提交,以此类推

rm命令

git rm <file>:删除工作目录的文件
git rm -f <file>:强制删除工作目录的文件,不做更新检查
git rm --cached <file>:删除暂存区的文件,停止追踪文件

mv命令

git mv <oldfile> <newfile>:为文件重命名
git mv -f <oldfile> <newfile>:强制为文件重命名,即使目标文件已存在
git mv <file> <dir>:移动文件到指定目录
git mv -f <file> <dir>:强制移动文件到指定目录名,即使目标文件已存在

分支与合并

branch命令
git branch:查看所有分支
git branch <branchname>:创建分支
git branch <branchname> <commit>:以特定提交为基创建分支
git branch -d <branchname>:删除分支(这是一个安全操作,Git会阻止删除包含未合并更改的分支)
git branch -D <branchname>:强制删除分支
git branch -m <oldbranchname> <newbranchname>:移动或者删除分支
git branch -M <oldbranchname> <newbranchname>:强制移动或者删除分支
git branch -r:列出所有被跟踪的远程分支
git branch -r -d <branchname>:删除被跟踪的远程分支
git branch -a:列出所有本地分支与被跟踪的远程分支

checkout命令

git checkout:检查本地仓库分支与远程仓库分支的差异
git checkout <branchname>|<tagname>:切换分支或切换到指定tag,同名时优先切换分支
git checkout -b <branchname>:新建分支并切换到该分支上
git checkout -B <branchname>:强制新建分支并切换到该分支上

merge命令

git merge <branchname>:将指定分支合并到当前分支上(默认附带提交操作),在merge后面使用-m 表示提交消息
git merge <commit>:将指定提交合并到当前分支上
git merge <oldbranch> <newbranch>:将oldbranch分支合并到newbranch分支上
git merge --squash <branchname>:将指定分支上所有修改放入当前分支工作目录与暂存区,不提交
git merge no--squash <branchname>:将指定分支上所有修改放入当前分支工作目录与暂存区,并提交

mergetool命令

git mergetool:在“merge”命令执行之后出现冲突时执行该命令,用来解决合并的冲突,冲突解决完了不要忘了提交

stash命令

git stash:储藏工作目录与暂存区的状态到堆栈中
git stash pop [stash@{id}]:恢复到指定储藏的状态(默认是最近一次储藏的状态),并从堆栈中移除该储藏
git stash apply [stash@{id}]:恢复到指定储藏的状态(默认是最近一次储藏的状态)
git stash drop [stash@{id}]:并从堆栈中移除指定储藏(默认是最近一次储藏)
git stash list:显示所有储藏信息

tag命令

git tag:列出所有标签
git tag -l 'v1.*':列出符合一定条件的标签
git tag <tagname>:新建标签

分享与更新项目

fetch命令

git fetch:下载远程仓库“origin”到本地
git fetch <remoterepository>:下载指定远程仓库到本地
git fetch <remoterepository> <branchname>:下载指定远程仓库指定分支到本地

pull命令

git pull <remoterepository> <remotebranchname>[:localbranch]:拉取指定远程仓库指定分支到本地仓库指定分支(默认是当前分支)

push命令

git push <remoterepository> <localbranch>[:remotebranch] [--tags]:推送本地仓库指定分支到远程仓库指定分支(默认是与本地分支同名的远程分支),默认是不推送标签到远程仓库的,加上–tags就会推送标签

remote命令

git remote:查看所有与本地仓库关联的远程仓库
git remote -v:查看所有与本地仓库关联的远程仓库,并显示url
git remote add <remote-name> <remote-url>:添加与本地仓库关联的远程仓库
git remote rename <oldname> <newname>:为远程仓库重命名
git remote remove <remote-name>:移除远程仓库

submodule命令

git submodule add repository-url dir:添加仓库到指定目录,使之成为本仓库的子模块
git submodule init:初始化子模块
git submodule update:更新子模块

子模块是本仓库依赖的另一个仓库,但是我们不会对所依赖的仓库(子模块)进行修改,只会在必要的时候进行更新操作。

考察与比较

show命令

git show [-times]:显示最近times次(默认是一次)提交的所有对象信息

log命令

git log:查看提交记录
git log --all:查看所有提交记录
git log --oneline:查看提交记录,以oneline形式显示,只显示一行,显示的内容时提交hash的前7位与提交消息
git log -p -times:表示查看最近times次提交改变的内容
git log -stat [-times]:查看最近times次(默认是所有)提交记录,并显示文件的差异分析

diff命令
如果想要查看具体某个文件的变化,只需要在命令最后添加-- 即可。在命令最后添加--

表示查看该目录下面的差异。

git diff:查看工作目录与暂存区的差异。如果文件还未被跟踪,则无法查看。
git diff --staged [<commit>]:查看暂存区与指定提交(默认是HEAD)的差异。在低版本的Git中,使用的是git diff --cached命令。
git diff <commit>:查看工作目录与指定提交的差异
git diff <commit> <commit>:查看两次指定提交的差异
git diff branchname:查看工作目录与指定分支的差异
git diff branchname branchname:查看两个指定分支间的差异

shortlog命令

git shortlog:显示总提交次数与每次提交的提交消息

describe命令

git describe [<commit>|<tag>]:查看指定提交或者指定标签(默认是最近一次提交)的注解标签信息
git desribe --tags [<commit>|<tag>]:查看指定提交或者指定标签(默认是最近一次提交)的标签信息
git desribe --all [<commit>|<tag>]:查看指定提交或者指定标签(默认是最近一次提交)的引用信息

reflog命令

git reflog:显示所有提交,下拉,推送,与切换分支操作
git reflog --all:显示所有提交,下拉,推送操作

修补

apply命令

git apply [--index|--cached] patchname.patch:在暂存区与工作目录或者暂存区(默认是工作目录)打补丁

git apply --reverse|-R patchname.patch:反向打补丁

git apply --reject patchname.patch:打补丁,将没有冲突的文件合并,将有冲突的文件标记出来,并生成对应的.rej文件

cherry-pick命令

git cherry-pick <commit>:将另一个分支上面的指定提交应用到当前分支上
git cherry-pick banchname:将指定分支上面的最后一次提交应用到当前分支上

rebase命令

git rebase branchname:将指定分支上所有修改应用到当前分支上
git rebase branchname branchname:将第一个指定分支上所有修改应用到第二个分支上

在rebase加上-i会提供交互式的变基操作

revert命令

git revert <commit>:恢复一个指定提交

调试

bisect命令

使用二分查找,找到引入bug的提交

git bisect start:开始二分查找
git bisect bad [<commit>]:设置指定提交(默认是当前分支)为bad
git bisect good [<commit>]:设置指定提交(默认是当前分支)为good

输入了上面三个命令后就会自动开始二分查找,我们之后只需要标记当前提交时bad还是good就行了,如果当前找的的提交时bad就输入git bisect bad,否则输入git bisect good直到找到有bug的提交。

blame命令

显示修改和作者最后修改的文件的每一行,这就是一个“问责”的命令,如果哪里有问题,我们可以很快地找到该问题是谁导致的。

git blame filename:查看指定文件所有的操作者,看看是谁错误地修改了该文件

grep命令

git grep keys:在工作目录中所有文件中搜索keys
git grep --cached keys:在暂存区中所有文件中搜索keys

彻底搞懂 Git Rebase
git stash

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值