Git常用命令

666 阅读5分钟

什么是git?怎么来的? 不再赘述,直入正题!

git分区

  • 工作区(working)
    编辑区,直接操作
  • 暂存区(stage)
    暂时存放的区域
  • 版本库(loacl repository)
    已经提交数据
  • 远程库(remote repository)
    可push到远程库

clone项目

git clone [HTTPS|SSH] [directoryName]

HTTPS:使用HTTPS都可以clone项目,但是push需要验证用户名和密码;

SSH:clone项目必须是拥有者或者管理员,需要添加SSH Key。push时,不需要验证,如果配置SSH key时设置了密码,则需要输入密码的,否则不需要输入密码。

创建SSH Key

每次都输入账号密码验证?
明文配置username:password@github.com?
配置一下SSH key吧!

$ ssh-keygen -t rsa -C "user@gmail.com"

成功后ssh key位置:
window在c盘的当前用户找到.ssh文件夹下的id_rsa.pub文件用记事本就可以打开,另一个是私钥

mac在home目录: 命令行 cat ~/.ssh/id_rsa.pub

添加公钥到git

登录github > 头像 > settings > SSH and GPG keys > new ssh key
id_rsa.pub的内容都复制到key > 保存

基本配置

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

查看git配置

$ git config --list

初始化

先有本地库,再创建远程仓库

$ git init 

本地库链接远程库

$ git remote add origin https://github.com/repositories.git  
$ git push -u origin master 

注意:第一次push的时候,加上-u参数,Git就会把本地的master分支和远程的master分支进行关联起来,我们以后的push操作就不再需要加上-u参数了

查看/修改远程库

查看

$ git remote -v

修改远程库 1.直接修改

$ git remote set-url origin [url]

2.先删除,再添加

$ git remote rm origin
$ git remote add origin [url]

提交

工作区提交到暂存区

$ git add [文件名]
$ git add .  提交所有

工作区提交到版本库

$ git commit -a -m "msg"

提交暂存区到版本库

$ git commit -m "msg"

版本库提交远程库

当前分支
$ git push
指定分支
$ git push origin branchName 

查看各区不同之处

查看各个区域状态添加、删除、修改、冲突、待push...

$ git status

查看工作区和暂存区的区别

$ git diff [README.md]

查看工作区和版本库的区别,还有版本库和版本库(哈哈哈)

$ git diff HEAD       上次提交
$ git diff commitID   某次提交commitID
$ git diff branchName 分支
$ git diff commitID   commitID 两次commitID区别
$ git diff HEAD -- [fileName|filePath] 上次提交和文件或路径
git diff 本地分支名 origin/分支名      本地分支和远程分支

暂存区和版本库区别

$ git diff --[cached|staged]

查看日志

查看本次命令行窗口的日志

$ git log
$ git log --pretty=oneline  一行显示

查看所有历史日志

$ git reflog

回退

工作区回退
git status也清空

$ git reset --hard 上传编号  恢复到commitID 
$ git reset --hard HEAD^     ^上一次远程库提交(push);不是commit  HEAD~10 10次够不够? 不够? 再来10次
$ git reset --hard HEAD@{0}   git reflog查看时的{0} 
// 以上是对本地的回滚,需要将本地回滚,强制将master分支同步到远程仓库
$ git push origin [分支名] --force 

工作区回退到上一次

$ git checkout -- README.md   一定要有-- ,没有--是切换到另一分支

两种结果:

  • README.md已经提交的版本库修改后,还没有被放到暂存区;现在,撤销修改就回到和版本库的状态。
  • README.md已经添加到暂存区后,又修改了;现在,撤销修改就回到添加到暂存区后的状态。

暂存区撤回工作区

$ git reset HEAD README.md // 不会清除status,确定从暂存区退回可直接使用git $ checkout -- README.md
$ git status
$ git git checkout -- README.md

版本库撤回到暂存区

$ git commit -m 'msg' --amend

撤回上次提交的日志和提交到master的内容到stage,然后再次把stage提a交到master。

删除

$ git rm 文件名

删除文件需本地和master的内容一样,否则不能直接删除,需要先使用rm 文件名,然后使用命令git commit -m "msg"完成本地和master的删除。

分支

查看分支

本地分支
$ git branch 
远程分支
$ git branch -r 
本地和远程分支
$ git branch -a

创建分支

$ git branch 分支名
切换并创建  
$ git checkout -b 分支名  

拉取远程分支并创建本地分支

git checkout -b 本地分支名 origin/远程分支名

更新原创分支 如果你的remote branch不是在origin下,按你得把origin换成你的名字。

git remote update origin --prune

本地分支与远程分支的映射关系

git branch -vv

重命名分支

$ git branch -m branchName newName

切换分支

$ git checkout 分支名

手动建立本地分支和远程分支的映射

git branch -u origin/分支名
git branch --set-upstream-to origin/分支名

撤销本地分支与远程分支的映射

git branch --unset-upstream

删除本地分支

$ git branch -D branchName     D不管提交还是没有提交都能删  
$ git branch -d branchName     d只有不提交才删除

删除远程库分支

$ git push origin --delete branchName

提交分支到远程库

$ git push -u origin branchName      

如果分支名存在直接提交,不存在会自动创建分支名

合并分支

不可查合并分支

$ git merge branchName

a向b合并,在b上执行此命令(使用快速合并)合并分支时当文件有冲突是不能进行合并需要手动进行调整。如果解决文件中冲突的的部分,然后add->commmit->push。

可查合并分支

git merge --no-ff -m "msg" branchName

合并分支之后,使用git log --graph 删除分支仍可查看合并的记录,-m "merge with no-ff" 当被合并的分支有提交到版本库的文件时,做的提交描述。

合并查看

git branch --merged  合并过得分支   
git branch --no-merged  没有合并过的分支  

分支log

git log --graph --pretty=oneline --abbrev-commit

冲突处理

当多人协作时,如果远程库被其他人员修改并已经推送。此时在push时会提示冲突,大概意思是,另一个存储库推送了一个最新的文件,要先解决冲突在推送。

简述下原因,知其然知其所以然!

首先orign/mastter中的commitID=0,本地仓库master分支commitID=0。

远程仓库有人员更新远程仓库库中master分支上,新的代码版本号commitID=1 ,此时远程仓库 orign/master的commitID=1。

本地仓库代码修改commit后,commitID=2。

需要本地和远程仓库的commitID为一致。解决冲突,产生新的commitID,然后push远程库;

解决方案:

  • fetch取回远程库的commitID=1,手动merge到本地库的分支;
  • stash隐藏本地仓库的改变,git pull后,释放隐藏区(适用还在工作区);
  • git pull把本地和远程仓库的commitID全部更改为一致;

1.fetch

1.1 取回分支

取回全部
git fetch --all
取回指定分支
git fetch origin branchName
取回并创建新的分支
git fetch origin branchName:newBranchName

取回的更新,在本地上要用'远程库/分支名'的形式访问。比如origin的master分支,就要是用用origin/master访问

查看远程分支

git branch -r

手动查看冲突项

git diff 本地分支名 origin/branchName  

1.2 手动合并

git merge origin/分支名 // 远程库的分支,合并到当前本地所在分支

1.3 git status 查看是否有冲突
解决文件,然后add->commmit->push

2.使用stash隐藏工作区

2.1 将本地修改存储起来

$ git stash 

本地的所有修改被暂时存储起来。

$ git stash list  可以查看stash记录
$ git stash show -p stash@{0} 暂存时git库的区别

暂存了本地修改之后,就可以pull了。

2.2 pull

$ git pull

2.3 还原隐藏的工作区

$ git stash pop [index] // 默认0

系统提示如下类似的信息:
Auto-merging c/environ.c
CONFLICT (content): Merge conflict in c/environ.c
意思就是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。

2.4 git status 查看是否有冲突 解决文件,然后add->commmit->push

删除stash

git stash drop <stash@{id}>

如果不加stash编号,默认的就是删除最新的,也就是编号为0的那个,加编号就是删除指定编号的stash。

清除所有stash

git  stash clear

git stash pop和git stash apply <stash@{id}>
git stash pop stash@{id}命令会在执行后将对应的stash id 从stash list里删除;
git stash apply stash@{id} 命令则会继续保存stash id。

3.pull

可能会有如下问题:
2.1 当前分支没有跟踪信息

指定要拉取的分支
git pull <origin> <branch_name>
指定跟踪的分支
git branch --set-upstream-to=origin/<branchName> 

2.2 合并分支的时候遇到冲突
1.按键盘字母 i 进入insert模式;
2.修改最上面那行黄色合并信息,可以不修改;
3.按"Esc"键;
4.输入":wq",注意是冒号+wq,按回车键即可;
2.3 git status 查看是否有冲突 解决文件,然后add->commmit->push

忽略文件跟踪

git工作区根目录下创建.gitignore文件,把要忽略的文件名/文件夹填进去,git自动忽略文件跟踪。 格式如下:

package-lock.json
node_modules/

把某些文件夹或文件加入忽略规则,发现并未生效,因为.gitignore只能忽略没有被追踪的文件,如果文件已经被记录了版本管理,则修改.gitignore是无效的。
解决方案先把本地缓存删除(改变成未被追踪状态),然后再提交,就不会出现忽略的文件了。

git rm -r --cached .
git add .
git commit -m 'update .gitignore'

配置命令别名

如下格式:

$ git config --global alias.cm commit 
$ git config --global alias.co checkout
$ git config --global alias.branches 'branch -a'

恢复命令别名
当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:
别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。
配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。

tag

查看

$ git tag

创建标签

$ git tag v1.0

指定commitID创建标签

$ git tag v0.9 6224937(commitID)

删除标签

$ git tag -d v0.9

查看标签信息

$ git show <tagname>

推送到远程仓库

git push origin v1.0

参与开源项目?

访问项目主页,点'Fork'克隆此仓库到自己的账号下,然后一定要从自己的账号下clone仓库,才能推送修改。
如果从源项目主页克隆,因为没有权限,不能推送修改。
如果你想修复bug或新增功能,开发完成后仓库推送到自己的仓库。
如果你希望源仓库能接受修改,可以在GitHub上发起一个pull request。源仓库是否接受pull request就不一定了。
源仓库有权限的用户查看提交的request进行回复或者同意合并。

git官网

Scott Chacon和Ben Straub 撰写pro git