Git常用命令

软件下载地址

https://gitforwindows.org/ Git
https://code.visualstudio.com/ vscode

查看git版本

git --vension 看git版本

配置用户名和邮箱

# 这里是声明全局的名字
git config --global user.name ‘自己的名字’
git config --global user.mail ‘自己的邮箱’

查看全局配置

cd ~
cat .gitconfig #就可以查看全局配置文件了.

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

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

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

新建版本库

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

在干净的文件夹里输入命令 `git init 项目名称`
建好文件后就会有一个.git的隐藏文件,如果把它删除了,就会断开git的连接,所有的版本控制记录就都没有了

clone 线上已经有的项目时

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

或者ssh连接时

` git clone ssh://git仓库地址:端口号/haimait/learn.git`

例:`git clone ssh://git@github.com:端口号/haimait/learn.git`

git clone -b 6.0 https://gitee.com/thinkcmf/ThinkCMF thinkcmf6
克隆 6.0分支的代码,下载后改文件夹名为thinkcmf6

查看远程仓库信息

git remote
git remote -v # 此命令可显示更详细信息

git fetch remote # pull 关联仓库的代码再本地

关联远程仓库
git remote add origin 创建地址 # 自己的git项目地址 将本地仓库与远程仓库关联

删除远程仓库联系
git remote remove origin 

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 查看此时工作环境就是干净的了.

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

gitignore

vim .gitignore 新建忽略配置文件
在.gitignore文件里添加规则,

	.idea
	.vscode
	*/.DS_Store
    *.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文件夹会被跟踪,认为没有在版本里

更多参考文档:
https://www.cnblogs.com/nayek/p/12289358.html

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

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

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

git push -f //强制推送本地分支到关联的远程分支上,用于回退版本后,撤消远程分支里的提交

查提交的日志

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 log --stat // 查看提交的详情

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分支(就是基于当前所在分支的代码复制到到ask分支上)

切换分支
git checkout ask //切换到ask本地分支 
在ask分支上操作的代码不会影响到master分支,它们是各自独立的

git checkout -b bbs //基于当前分支,创建并切换到bbs分支上
git checkout -b bbs master //基于本地的master分支,创建并创建并切换到bbs分支上
git checkout -b master origin/master //基于远程仓库的在本地的origin/master分支,创建并创建并切换到本地master分支上
-b该命令主要加了一个可选参数B,如果已经存在了同名的分支,使用 git checkout -b <new_branch>会提示错误,加入-B可选参数后会强制创建新分支,并且会覆盖原来存在的同名分支。

注意:上面是老版本的命令,创建分支和撤销都用checkout容易分不清,因此新版本创建分支推荐用switch
git switch -c dev 创建并切换到dev
git switch dev 直接切换到已有的dev分支

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

当前分支直接合并已提交并推送到远程的记录号,只合并提交的内容
git cherry-pick d43f469a263a42c5b812e53ebcb0fff495af9e30

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

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

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

删除分支
git branch -d bbs //删除bbs分支(如果是没有合并的分支是删除不了的)
git branch -D bbs //大D可以强制删除没有合并的分支(慎用大D)
git push origin --delete 删除远程分支的名字 

查看本地分支和远程分支的跟踪关系
git branch -vv
比如输入

$ git branch -vv
  develop   08775f9 [origin/develop] develop
  feature_1 b41865d [origin/feature_1] feature_1
* master    1399706 [my_github/master] init commit
develop分支跟踪origin/develop
feature_1分支跟踪origin/feature_1
master跟踪了my_github/master,且当前分支为master分支

更多参考文档:
https://www.cnblogs.com/mafeng/p/10137244.html

查看远程库

git remote -v
	
# 命令来把远程dev分支拉到本地
git fetch origin dev 

推送数据到远程仓库

git push -f //强制推送本地分支到关联的远程分支上,用于回退版本后,撤消远程分支里的提交

本地关联远程分支

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

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

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

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

管理远程分支

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

 命令行 : $ git branch -a

2、删除关联的远程分支

git remote remove origin

3、删除本地分支

$ git branch -d <分支的名字>
$ git branch -d ask
$ git branch -D ask //强行删除没有合并的ask分支

4、删除远程分支

 命令行 : $ git push origin --delete <BranchName>
 例1: $ git push origin --delete feature/ljy-2019-10-17

4、查看删除后分支们

 命令行 : $ git branch -a

暂存区

    1.查看暂存区列表
    git stash list 
    
    2.保存到暂存区
    git stash save "save message"   //执行存储时,添加备注,把已经add.到运输车里的文件(还没有commit),保存到暂存区
    当编辑完文件后,没有 `add .` 添加到提交车里前,或者没有commit前,不许切换到别的分支的.
    此时可以先保存到暂存区里,再切换到别的分支,把别的分支里的事件处理完后,
    再回到此分支里恢复暂存后,再删除暂存就可以了.
   
    3.显示做了哪些改动
	git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
	git stash show -p : 显示第一个存储的改动内容,如果想显示其他存存储,命令:git stash show  stash@{$num}  -p ,比如第二个:git stash show  stash@{1}  -p
	
	4.恢复暂存区
    git stash apply
    恢复暂存区后,暂存区里的文件依然存在,需要手动删除
	默认使用第一个存储,即stash@{0},
	如果要使用其他个,`git stash apply stash@{$num}` , 比如第二个:`git stash apply stash@{1}` 
    
    5.`git stash pop`命令恢复之前缓存的工作目录,将缓存堆栈中的对应 `stash` 删除,并将对应修改应用到当前的工作目录下,默认为第一个 `stash` ,即 `stash@{0}` ,
	如果要应用并删除其他 `stash`,命令:`git stash pop stash@{$num}` ,
	比如应用并删除第二个: `git stash pop stash@{1}`
	
	6.删除暂存区
    git stash drop stash@{0} //丢弃stash@{$num}存储,从列表中删除这个存储
	
	git stash clear :删除所有缓存的stash

注意git stash在各个分支之间是通用的,不同分支缓存的代码可以保存到另外的分支上。

注意git stash pop默认会恢复上一个,即第一个 stash@{0} 缓存的内容。建议使用 git stash pop 之前先使用一下 git stash list 查看一下,然后使用 git stash pop stash@{x}

标签

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

git tag -a tagName -m "my tag" //带备注的tag -a 标签名 -m 描述信息
git show tagName   //查看tag详细信息

推送标签
git push origin [tagName] //将tag同步到远程服务器
git push origin --tags 推送所有标签到远程

删除远程标签: 
git tag -d v0.1.2  //删除本地tag标签
git push origin :refs/tags/v0.1.2  //删除远程tag标签

基于tag创建新的分支
git branch newbranch newbranchv1.0  //会基于tag newbranchv1.0创建新的分支newbranchv1.0

切换到新的分支  
git checkout newbranch 

如果要在 tag 代码的基础上做修改,你需要一个分支: 
git checkout -b new_branch_name tag_name
例:fix_tag_main-v2.20.0:新的分支名  main-v2.20.0:仓库中的tag名称
git checkout -b fix_tag_main-v2.20.0 main-v2.20.0

更多详情:
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 stash先缓存当前修改 rebase后,再释放缓存
git rebase master //把指针指向在master的最新提交点 再合并master代码到当前分支 ,如果有冲突,在ask上解决冲突,再commit
git checkout master 再切到master主分支上
git merge ask  此时就不会再产生冲突了

# 压缩提交记录 如果有多次提交记录了,希望压缩到一次
git rebase -i 日期的id #日志的id多写一个版本的日志id(可以用git log查看)
或者
git merge -i HEAD~~  #合并最近两次提交记录
git merge -i HEAD~3  #合并最近三次提交记录
下面的改为pick 改为 s  # 表示最近的提交记录信息都合并到最早第一次提交记录中

image

image

alt + x #退出编辑模式
shift +:#进入命令行交互模式
wq 回车 #保存并退出
此时会自动进入,编辑提交信息编辑器
编辑提交记录再保存并退出

image

image

到此3次提交记录,已经压缩成了一条

image

或者直接使用goland IDE操作压缩提交记录

选择需要提交的记录,选择压缩
image
编辑提交记录--> ok
image
到此已经压缩成功
image

rebase记录图

创建新仓库(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
    
	# 删除关联的远程分支
	
	git remote remove origin
	
	# 命令来把远程dev分支拉到本地
	git fetch origin dev 
	
    推送数据到远程仓库

    第一次推送数据到线上仓库,线上仓库里没有当前推送的这个新分支,需要加-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.

代码管理

pull 拉取代码

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

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

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

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

push 提交代码到远程仓库

  1. 提交代码到远程仓库

    第一次推送是要加上-u,可以把本地的master和远程的master关联起来,方便以后的推送或者拉取
    git push -u origin master

    git push origin master #之后推送可以直接用该命令

    git push #推送当前分支到远程关联的分支

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

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

  2. 修改提交的备注

    把本次更改的文件合并到上次提交的日志里
    把更改的文件git add . 件提交到运输车后
    git commit --amend //提交到上一次提交记录中.

    保存退出后.就样就把本次更改的文件合并到上次提交里了.
    不会另创一条提交日志了

    git commit --amend --author "提交人姓名 邮件@qq.com"

更多常用操作:

https://blog.csdn.net/wangdawei_/article/details/124483833

vscode中使用视频教程:

https://www.bilibili.com/video/BV1db4y1d79C?spm_id_from=333.1007.top_right_bar_window_history.content.click

克隆仓库:git clone git地址
初始化仓库:git init 7:45

添加文件到暂存区:git add -A 11:27  图形操作 14:50
把暂存区的文件提交到仓库:git commit -m 提交信息 12:13 图形操作 15:10
查看提交的历史记录:git log --stat 

工作区回滚某个文件:git checkout filename
工作区回滚所有修改过的文件:git checkout .
撤销最后一次提交:git reset HEAD^1 20:17 图形操作 21:05
图形化操作在 COMMITS工作区里->提交记录里-->右键-->Undo Commit


以当前分支为基础新建分支:git checkout -b branchname 23:50
列举所有的分支:git branch 32:27
单纯地切换到某个分支:git checkout branchname 25:00
删掉特定的分支:git branch -D branchname 32:20
合并分支:git merge branchname 26:58
放弃合并:git merge --abort 31:57

添加远程仓库:git remote add origin 地址34:30
本地仓库改名:git branch -M main34:34
上传代码:git push -u origin main35:00

推送当前分支最新的提交到远程:git push 36:00
拉取远程分支最新的提交到本地:git pull	36:39

找开源项目的一些途径
https://github.com/trending/
https://github.com/521xueweihan/HelloGitHub
https://github.com/ruanyf/weekly
https://www.zhihu.com/column/mm-fe

特殊的查找资源小技巧-常用前缀后缀
• 找百科大全 awesome xxx
• 找例子 xxx sample
• 找空项目架子 xxx starter / xxx boilerplate
• 找教程 xxx tutorial

posted @ 2019-03-01 06:02  HaimaBlog  阅读(332)  评论(0编辑  收藏  举报