赞
踩
前言:只记录一些简单的命令,具体安装步骤可参考:Git 详细安装教程(详解 Git 安装过程的每一个步骤)_mukes的博客-CSDN博客_git安装
具体git工作原理可参考:图解Git (marklodato.github.io)
或者参考官网详细的介绍:Git - Book (git-scm.com)
git 各平台安装包下载地址为:Git - Downloads
git客户端(windows)下载地址还可以戳链接:Git for Windows
注:git命令(git init除外)一定要在Git仓库目录内执行(即要在有.git目录的文件下执行),在仓库目录外执行会报错“fatal: not a git repository (or any of the parent directories): .git”
git --version
Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。
在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录(如果没有看到.git目录,是因为这个目录默认隐藏了的,使用ls -al命令可以查看),该目录包含了资源的所有元数据,其他的项目目录保持不变。
使用当前目录作为Git仓库
git init #执行完后,会在当前目录下生成一个.git的目录,所有Git需要的数据和资源都存放在这个目录中
使用指定目录作为Git仓库
git init newtest #newtest目录下会生成一个.git的目录,用来存放Git需要的数据和资源
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪
注1:add的文件filename必须在当前目录下存在,否则会报错“fatal: pathspec 'aaa' did not match any files”
git add <filename> #跟踪指定文件<filename>,即将文件filename添加到暂存区去
git add <filename1> <filename2> #添加多个文件
git add . #跟踪所有改动过的文件,会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件
注2:add文件时出现以下错误:
解决方法:
- rm -rf .git #删除原来的.git目录
- git config --global core.autocrlf false
- git init
- git add aaa.txt #再重试添加
删除工作区文件
git rm <filename>
其他:新建了一个文本bbb,但是git rm 的时候报“fatal: pathspec 'bbb' did not match any files”,百度了下可能有以下两个原因导致的:
①路径有问题,目录下并没有bbb文件
②新版本的git防止误删导致文件无法找回的操作,bbb文件是新建的,没有commit过,如果删除,是无法找回的,可以先add然后使用rm -f删除
注:如果在删除文件前,文件内容做了修改,且已经git add,则需要加-f强制删除:
git rm -f <filename>
删除暂存区的文件,保留工作目录的
git rm --cached <filename>
git mv <filename> <newfilename>
其他:git mv只针对在暂存区的或者已经commit过的文件名更改,否则会报错“fatal: not under version control, source=bbb, destination=123b”
注1:如果新文件名已经存在依然要修改的话,可以加-f强制重命名:
git mv -f <filename> <newfilename>
显示当前git的配置信息
git config --list
修改当前仓库下git的配置文件
git config -e #-e,e即edit,编辑的意思
修改机器上所有仓库的配置文件
git config -e --global
设置提交代码的用户信息
- git config --global user.name "usename"
- git config --global user.email "xxx@xxx.com"
下面给大家举例了各种阶段下的状态:
阶段1:创建了Git库,但是目录下没有任何文本文件
On branch master:表示master分支
No commits yet:表示本地库还没有任何东西提交
nothing to commit (create/copy files and use "git add" to track):表示工作区没有任何可以提交的东西,可以用git add命令添加文件
阶段2:目录下有文本文件,但是没有执行add命令
nothing added to commit but untracked files present (use "git add" to track):表示工作区有文件,但是该文件没有被跟踪存(即没有被添加到暂存区),不能提交,可以使用git add命令跟踪
阶段3:目录下的文件进行了git add操作
Changes to be committed:(use "git rm --cached <file>..." to unstage):表示暂存区有文件可以提交,且提示了可以使用git rm --cached 命令将暂存区的文件删除(只从暂存区删除,不删除本地的)
阶段4:commit失败
nothing to commit, working tree clean:表示不能提交且工作树里是空的
这种情况出现的原因有两个:
原因1:重复commit了,已经commit过,再次commit会出现"nothing to commit, working tree clean"的提示
原因2:修改了文件,但只是修改了大小写(比如把apple改成APPLE),git默认设置了忽略大小写的,所有修改时,git认定没有修改,不能commit
可以通过输入:
git config core.ignorecase false #将当前目录下的文件设置为不忽略大小写
git config --global core.ignorecase false #设置全局都不忽略大小写
查看工作区和暂存区文件的区别(相当于对比未add和已add过的文件)
git diff
查看暂存区(已add未commit)和上一次commit的区别
git diff --cached
查看工作区(包括已经add和未add的)和上一次commit的区别
git diff HEAD
查看两个分支上commit内容的区别 (注:建分支的命令文章后面第17点有介绍)
git diff <branch1> <branch2>
以上添加了文件后,要将这些文件真正被保存在Git仓库,需要使用git commit提交到仓库
git commit -m “说明” <filename> #filename指定要提交的文件名
注1:-m后面输入本次提交的说明,不加-m的话会出现编辑器让你填写注释信息
如果修改了很多个文件,一个个add后commit太麻烦了,可以使用-a标识
-a可以将所有被修改或者已删除的且已经被git管理的文档提交到仓库中(-a不会让新文件被提交,只能修改)
git commit -a -m "说明"
注2:在commit的时候,要注意空目录是不能提交的,空目录提交会出现下面这种情况:
git log #查看历史commit记录
(空格向下翻页,b向上翻页,q退出)
注1:以上图片中的记录代表的意思依次是:
commit 提交对应的版本号
author 本次提交人和提交人的邮箱
date 提交的时间
最后一行表示提交版本的注释,就是commit -m “XXX”后面的XXX
注2:加--oneline只显示前面部分的版本号和注释
git log --oneline
注3:加--pretty=oneline只显示完整的版本号和注释
git log --pretty=oneline
注4:加-p查看每个commit具体修改的内容
git log -p
注5:查看文件的历史修改记录可以用git blame
git blame <filename>
注6:查看包括部分版本号、注释、回退的次数的历史记录可以用git reflog
git reflog
(reflog跟log的区别在一个可以显示回退的次数一个不可以,举例:比如回退了版本后,又想回退到之前最新的版本上去 ,用git log查看不能看到最新的版本号的,但是git reflog可以看到最新的版本号)
git reset --soft 回退版本,同时保留先前最新版本(即回退前的版本)的工作区和暂存区的内容
- git reset --soft HARD
- git reser --soft xxxxx #xxxxx指前部分版本号,可以通过git reflog获取
注:HEAD说明
HEAD表示当前版本
HEAD^表示上一个版本
HEAD^^表示上上一个版本
HEAD^^^表示上上上一个版本
HEAD~0表示当前版本
HEAD~n表示回退n个版本
git reset --mixed 回退版本后,保留先前最新版本(即回退前的版本)的工作区内容,清空先前最新版本的暂存区内容
- git reset --mixed HEAD
- git reset --mixed xxxxx #xxxxx表示前面部分版本号,可以通过git reflog获取
git reset --hard 回退版本后,先前最新版本的工作区内容和暂存区内容全部不保留,被回退的版本的工作区内容和暂存区内容替代
- git reset --hard HEAD
- git reset --hard xxxxx #xxxxx表示前部分版本号,通过git reflog可以获取
注:如果修改了文件内容,但是还没有add,想撤销,可以使用git checkout :
git checkout <filename>
将其他仓库克隆到本地,且clone结束后,本地目录下会有一个隐藏的.git文件,clone操作是一个从无到有的克隆操作,不需要git init
初始化。
- git clone <url> #url是要拷贝的代码库
- git clone <url> <filename> #将代码库拷贝下拉存放到文件里面,文件名命为filename
添加远程仓库 add
git remote add <name> <url> #url指拉取代码的url,远程仓库的名称name推荐使用默认的名称 origin
查看远程仓库的地址 -v
git remote -v #-v:–verbose 的简写,列出详细信息,在每一个名字后面列出其远程url
注:不加任何参数:git remote 可用来列出关联的远程仓库的名称
查看远程仓库的详细信息 show
git remote show <name> #name指远程仓库的名称
删除远程仓库 rm
git remote rm <name>
重命名远程仓库 rename
git remote rename <oldname> <newname>
注:更多关于git remote的命令可以使用git remote --help获取
将远程代码库的更新全部下载到本地
git fetch <远程库名>
将远程代码库的某个分支的更新下载到本地
git fetch <远程库名> <远程库中的某个分支名>
注1:取回远程仓库分支上的更新后,会返回一个FETCH_HEAD,表示该分支处于最新状态,可以通过这个FETCH_HEAD查看取回的更新信息
git log -p FETH^HEAD
注2:也可以使用下面的方法对比本地仓库跟远程仓库的区别
git log -p <本地分支名>.. <远程库> <远程分支名>
将远程代码的某个分支上的更新全部下载到本地新建的分支上
git fetch <远程库名> <远程库上的分支名>:<本地新建的分支名>
注:比较以上两个分支的不同可以使用git diff master dev
前面讲的git fetch是将远程仓库的最新代码拉取到本地,拉取后可以自行决定是否合并到本地分支上,而git pull是将远程仓库的最新代码拉取下来后直接合并到本地,相当于git pull=git fetch +git merge
git pull <远程库名> <远程库的某个分支名>:<本地分支名>
git push <远程库名> <本地分支名>:<远程库的某个分支名>
注1:如果不加远程库的分支名,则表示将本地的分支上传到远程库里的一个跟本地分支名相同的分支上并合并,若远程库里没有跟本地同名的分支,则在远程库新建一个同名的分支
- git push <远程库名> <本地分支名>
- #例:git push origin master将本地的master分支上传到远程库origin的master分支上,如果后者的分支不存在则新建
注2:如果不加本地分支名也不加远程库分支名,则表示将当前所在的分支上传到远程对应的同名分支上
- git push <远程库>
- #例:git push origin 将当前分支上传到远程库origin的对应分支上
注3:如果不加本地分支名,则表示删除远程库的分支,因为不加本地分支名相当于上传一个空的分支到远程库
- git push <远程库名> :<远程库的分支名>
- #例:git push origin :master 将远程库的master分支删除
注4:如果本地分支与多个仓库存在追踪关系,则可以使用 -u 参数指定一个默认远程库,这样后面就可以不加任何参数使用 git push
- git push --u <远程库名> <本地分支名>
- #例:git push --u origin master 将本地master分支上传到指定的远程库origin的master分支上,同时指定origin为默认库,后面就可以不加任何参数使用git push了
注5: 使用--all参数可以将本地分支全部上传到远程库中
- git push --all <远程库名>
- #例:git push --all origin 将本地分支全部上传到远程库origin对应的分支中,没有对应分支的则新建
新建分支
git branch <分支名>
查看分支
git branch
注:不加任何参数表示查看本地所在的分支,加-a表示查看所有的git分支,加-r表示查看远程库的git分支 ,加--merged查看已经与当前分支合并过的分支,加--no-merged查看未合并的分支
master
分支前的 *
字符:它代表现在检出的那一个分支(也就是说,当前 HEAD
指针所指向的分支),这意味着如果在这时候提交,master
分支将会随着新的工作向前移动。 如果需要查看每一个分支的最后一次提交,可以运行 git branch -v
命令
切换分支
git checkout <分支名>
删除本地分支
git branch -d <分支名>
注 1:删除远程分支可以使用git push
- git push <远程库名> --delete <远程分支名>
- #或者也可以使用git push <远程库名> :<远程分支名>的命令删除
注2:删除本地存在,但远程库上已经不存在的分支的时候,可以使用git fetch -p命令
git fetch -p
重命名分支
git branch -m <旧分支名> <新分支名>
注:重命名远程分支
- git branch -m <oldname> <newname>#将本地分支重命名
- git push <远程库名> <newname> #将新的分支上传到远程库
- git push --delete <远程库名> <oldname> #删除远程的旧分支
合并分支
git merge <被合并的分支名>
将dev分支合并到master分支上,当前必须先处于master分支上
注:因为代码没有修改,没什么区别,所以合并显示Already up to date.
参考文档链接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。