Git常用命令

老师文档
https://gitee.com/houdunren/code/blob/master/docs/Git.md

git --vension 看git版本

cd 进入家目录

mkdir edu 新建edu文件夹

ls / ll / dir / ls -a (-a可以看到隐藏的文件) 查看文件夹下的所有文件

ls 查看出来的文件,前面是第一个是-的,说明是文件,如果是d开头的,说明是文件夹

rm -rf edu 强制删除edu文件夹

rm -rf * 强制当前目录里所有的文件和文件夹

pwd 看当前的文件所在的路径

chmod -R 777 ./edu 加权限

git config --global user.email 'whm2416@qq.com'

git config --global user.name 'haima1004'

这里是声明全局的名字

执行上面的两条命令后,在cd回车,进入家目录

cat .gitconfig 就可以查看刚新建的全局配置文件了.

.gitconfig里记录的就是上面声明的邮箱和名字
vim .gitconfig 可以编辑这个文件 (要在家目录里执行这个命令)
编辑完后,esc退出 -> shift+; -> wq 保存并退出

在git文件夹里输入 git init 在你要新建版本库的文件夹里创建一个初例化的仓库

git config user.email '228654416@qq.com'
git config user.name 'haima'
ls -a
cat config 

这样在git文件夹里就声明了当前仓库的用户信息

新建项目时.

在干净的文件夹里输入命令 `git init`
建好文件后就会有一个.git的隐藏文件,如果把它删除了,就会断开git的连接

管理线上已经有的项目时

在干净的文件夹里输入命令`git clong 加https`里的仓库地址

git的基本工作流程

提交代码的流程:
本地编辑完后,add. 添加到运输车,然后再commit -m "操作说明" 到本地的版本仓库
然后再git push到线上的代码仓库里.

工作流程

touch a.php 新建文件,
git add a.php 放入小推车
git status 查看工作环境:
有红色的文件,就是没有提交到运输车里的文件,没有版本控制的文件
vim b.php  >  i > 输入文字 > shift+; > wq 
git status 查看工作环境:
绿色的文件,就是已经放到运输车里的的文件,但是也是没有版本控制的
有红色的文件,就是没有提交到运输车里的文件,没有版本控制的文件

git add b.php 把b.php文件也放入小推车里. 
git add . 是一次把所有的文件都放入到小推车里
git status 查看工作环境,此时都是绿色的文件了,说明都放入到小推车里了.
git commit -m '提交说明'  把小推车里的文件提交到本地仓库里.
git status 查看此时工作环境就是干净的了.

此后再修改完文件后,重复上面的步骤,提交到本地仓库里.

vim .gitignore 新建忽略配置文件

在.gitignore文件里添加规则, 
*.txt 忽略所有的.txt格式的文件,忽略后add . 命令就是不会提交到小推车里.
!a.txt 除了a.txt文件不忽略.
/vendor/*.php    忽略vendor目录里的.php格式的文件
/vendor/*        忽略vendor目录里的所有文件
/vendor/**/*.php 忽略vendor目录及子文件里的所有.php格式的文件
/vendor          忽略vendor的文件夹.

线上的代码仓库一般大概会给一个G左右的空间


在git里如果是空文件夹默认不会跟踪.
git status也是看不到的,所以文件夹里必需有文件,并且文件没有被忽然的,才能被提交小推车里.

mkdir vendor 建新vendor文件夹,
touth vendor/a.txt 在vendor文件夹里新建a.php文件
git status 如果vendor没有被.gitignore忽略,就可以看到vendor文件夹了.

删除仓库里的文件

1.删除仓库里的文件,本地的文件同时也会被删除
如果有些文件错放入仓库里的了,想要称除它.
git rm a.txt 这样本地和代码库里的文件就都会被删除.(默认本地和仓库里的代码应该是同样的).

![](https://img2018.cnblogs.com/blog/1441611/201903/1441611-20190301071425638-810451420.png)

2.只删除仓库里的vendor/b.php,本地的vendor/b.php保留
git rm --cached ./vendor/b.php 
git rm --cached -r vendor 只删除仓库里的文件,本地的vendor保留
git status 查看本地的vendor文件夹会被跟踪,认为没有在版本里

删除暂存区(提交车)里的文件

当文件提交到暂存区,还没有commit时,发现文件提交错了
可以把文件撤消回来
git reset HEAD a.php //只撤消a.php
git reset HEAD * //撤消所有
git checkout -- c.php //还原c.php到最初状态(没有修改之前的状态).

git reset hard 864b3c6 //恢复到864b3c6版本

改名字

git mv a.php b.php //把本地的a.php改为b.php
git add 'b.php' //改完后再添加到运输车里
git commit -m 'change b.php' //提交改完后的b.php到仓库里

查提交的日志

git log //看提交信息
git log -p //看提交的详细信息
git log -p -1 //看最后一次提交的信息.
git log -p 2  //看最后二次提交的信息.
git log --oneline //看简短的文件变化信息
git log --oneline -p //看简短的详细点的文件变化信息
git log --name-log  //查看文件的发生变化
git log --name-status //查看文件发生了什么变化,是add 还是删除了
git log --name-only 看最近提交的文件
git reflog //查看简短提交信息

修改提交的备注

把本次更改的文件合并到上次提交的日志里
把更改的文件git add . 件提交到运输车后
git commit --amend //进入vim编辑器后,修改上次提交的备注.
保存退出后.就样就把本次更改的文件合并到上次提交里了.
不会另创一条提交日志了

git命令全局别名

git config --global alias.a add . //给add . 启个a别名
其实操作的就是家目录里的.gitconfig文件.
我们可以直接去到家目前里用vim修改它
cd 回车
vim .gitconfig
[alias]
    a = add .
    c = commit  //没有添加-m,所以直接git c时会自动进入vim编辑提交的说明
    l = log
    s = status
保存退出

系统Alias

在家目录里 ls -a可以看到 ~/.bash_profile 文件,
在它里面写上,此时就定义了系统别名,之前定义的全局依然生效

alias gs="git status"
alias gc="git commit -m "
alias gl="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit  "
alias gb="git branch"
alias ga="git add ."
alias go="git checkout" 

标准的分支操作工作流

分支的原理

当开发新功能时可以新建分支,在分支里开发完成后,把最终版再合并到master上,测试没有问题了,就可以pull到服务器的主要线了    

查看分支
git branch //查看本地的分支
git branch -a //查看所有分支(本地加线上) 

创建本地分支
git branch ask //创建ask分支(就是复制一份master主线的代码到ask分支上)

切换分支
git checkout ask //切换到ask分支 
在ask分支上操作的代码不会影响到master分支,它们是各自独立的
git checkout -b bbs //创建并切换到bbs分支上

合并分支
当bbs分支的代码开发完后,切到master主分支上
git merge ask  //合并bbs分支的代码到master主分支上

解决冲突问题
当两个分支(这里以ask和bbs两个分支为例),都修改了同一个文件时,他们都合并到到master主分支上时,
就会产生冲突,此时就会在解决冲突的状态下.按提示手动修改冲突的文件.再重新提交到仓库里.

查看已经合并的分支
git branch --merged //显示分出来的所有分支里面的代码都是一致的.

查看没有合并的分支
git branch --no-merged //此时就举看到没有合并的分支

删除分支
git branch -d bbs //删除bbs分支(如果是没有合并的分支是删除不了的)
git branch -D bbs //大D可以强制删除没有合并的分支(慎用大D)
git push origin --delete 线上支付的名字 
![](https://img2018.cnblogs.com/blog/1441611/201912/1441611-20191220205451315-2102057746.png)

暂存区

1.查看暂存区列表
git stash list 

2.保存到暂存区
git stash //把已经add.到运输车里的文件(还没有commit),保存到暂存区
当编辑完文件后,没有 `add .` 添加到提交车里前,或者没有commit前,不许切换到别的分支的.
此时可以先保存到暂存区里,再切换到别的分支,把别的分支里的事件处理完后,
再回到此分支里恢复暂存后,再删除暂存就可以了.

3.恢复暂存区
git stash apply
恢复暂存区后,暂存区里的文件依然存在,需要手动删除

4.恢复暂存区,并删除暂存区里的暂存
git stash pop

5.删除暂存区
git stash drop stash@{0} //删除暂存区0号文件

标签

git tag //看标签列表
git tag 1.0 //把当前代码打上1.0的版本
git tag 2.0 //把当前代码打上2.0的版本
当完成一个功能模块后(测试稳定了),想要发布后,可以打上标签.

git tag -a tagName -m "my tag" //带备注的tag
git show tagName   //查看tag详细信息
git push origin [tagName] //将tag同步到远程服务器
git tag -d v0.1.2  //删除本地tag标签
git push origin :refs/tags/v0.1.2  //删除远程tag标签


更多详情:
https://www.jianshu.com/p/cdd80dd15593    

生成zip代码发布压缩包

git archive master --prefix='haima/' --form=zip > haimamaster.zip
此时会把所有master主分支里的文件放在haima文件夹里,然后压缩成haimamaster.zip文件

rebase

git rebase master //把指针指向在master的最新提交点

场景,在master主分支创意ask分支,当ask分支改变内容后commit时,同时master主分支的内容也改变了,
此时在master主分支上合并ask分支的代码就会产生冲突.这时只能由master管理来解决冲突问题了.
这样是不合理的.

解决方式:
当ask分支改变内容后,添加->提交 
git add . 
git commit -m 'edit ask'
git rebase master //把指针指向在master的最新提交点 
git checkout master 再切到master主分支上
git merge ask  此时就不会再产生冲突了


创建新仓库(github上)

这里有两种方式:
1.本地已经有项目代码时,在线上创建一个干净的没有提交的项目.
    关联远程
    创建本地库并完成初始提交

    echo "# hd-xj" >> README.md
    git init
    git add README.md
    git commit -m "first commit"
    添加远程仓库
    
    git remote add origin git@github.com:houdunwang/hd-xj.git
    
    查看远程库
    
    git remote -v
    
    推送数据到远程仓库

    第一次推送数据到线上仓库,线上仓库里没有当前推送的这个新分支,需要加-u,(这时就会在线上新建这个分支,推并关联它)
    git push -u origin master

    第二次再推送数据时
    git push 即可

    
    删除远程仓库关联
    
    git remote rm origin

2.本地没有代码时,把线上的代码 用`git clong 项目ssh地址` 命令克隆到本
通过 clone 克隆的仓库,本地与远程已经自动关联,上面几步都可以省略。

生成秘钥

使用ssh连接Github发送指令更加安全可靠,也可以免掉每次输入密码的困扰。

在命令行中输入以下代码(windows用户使用 Git Bash)
` ssh-keygen -t rsa -C “YOUR_EMAIL@YOUREMAIL.COM”`
一直按回车键直到结束。系统会在~/.ssh 目录中生成 id_rsa和id_rsa.pub,即密钥id_rsa和公钥id_rsa.pub。
把公钥放到线上的仓库里,就ok了.

详细参考:
`https://cloud.tencent.com/developer/article/1343014`

向GitHub添加秘钥

clone https 的方式下载的代码,配置公钥后,pull/push数据还是要输入账号密码

解决方法:

vim .git/config
url = https://gitee.com/haima1004/layhm.git 替换为
url = git@gitee.com:haima1004/layhm.git

测试是否配置成功

完成后可以在命令行测试是否配置成功,首次建立链接会要求信任主机

ssh -T git@github.com //github

ssh -T git@gitee.com //码云

在服务器添加完公钥后报错
sign_and_send_pubkey: signing failed: agent refused operation

haima@haima-PC:~/go/src/haimait/gin_web$ ssh -T git@github.com
sign_and_send_pubkey: signing failed: agent refused operation
Permission denied (publickey).
haima@haima-PC:~/go/src/haimait/gin_web$ eval "$(ssh-agent -s)"
Agent pid 25192
haima@haima-PC:~/go/src/haimait/gin_web$ ssh-add
Identity added: /home/haima/.ssh/id_rsa (/home/haima/.ssh/id_rsa)
haima@haima-PC:~/go/src/haimait/gin_web$ ssh -T git@github.com
Hi haimait! You've successfully authenticated, but GitHub does not provide shell access.

提交代码到远程仓库

提交代码之前一定要把git pull origin master //先把线上的代码更新下来

先把代码commit到本地的仓库里,
git push origin master //提交到线上的仓库里

如果向远程仓库推送代码没有反应,可以清空~/.ssh 目录中的 known_hosts文件里的内容,再重新生成并添加密钥到仓库里,就可以了

本地分支与GITHUB远程分支同步

1.创建远程ask分支
在本地ask分支环境上,
git push --set-upstream origin ask
本地ask分支创建远程ask分支,并关联远ask程分支,并推关本地ask分支代码送到远程ask分支上 

2.删除远程ask分支
git push origin --delete ask

3.删除本地ask分支
git branch -d ask
git branch -D ask //强行删除没有合并的ask分支

pull 拉取代码

拉取远程主机某个分支的更新,再与本地的指定分支合并。

克隆完线上的仓库下来后,本地只有一个master

1.git pull origin ask:ask
此时本地就把线上的ask分支的代码也拉取下来了,本地就是ask分支了

2.拉取origin主机的ask分支与当前分支合并 git pull origin ask
3.如果远程分支与当前本地分支同名直接执行 git pull

push 提交代码到远程仓库

git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相似。

将当前分支推送到origin主机的对应分支(如果当前分支只有一个追踪分支 ,可省略主机名)

git push 

使用-u选项指定一个默认主机 ,这样以后就可以不加任何参数直播使用git push。

$ git push -u origin master

删除远程ask分支 git push origin --delete ask

![](https://img2018.cnblogs.com/blog/1441611/201912/1441611-20191220205511006-1684164123.png)


本地ask分支关联远程分支并推送 git push --set-upstream origin ask

本地关联远程分支

例:使用场景:远程仓库里已经有dev代码 本地也有dev代码 但是还没有添加上关联

git branch --set-upstream-to=origin/远程要关联的分支名 本地分支名称

git branch --set-upstream-to=origin/dev dev

管理远程分支

1、查看项目的分支们(包括本地和远程)

 命令行 : $ git branch -a

2、删除本地分支

$ git branch -d <分支的名字>

3、删除远程分支

 命令行 : $ git push origin --delete <BranchName>

4、查看删除后分支们

 命令行 : $ git branch -a
原文地址:https://www.cnblogs.com/haima/p/10454394.html