安装
Windows 平台上安装
安装包下载地址:gitforwindows.org/
国内的镜像:npm.taobao.org/mirrors/git…
Mac 平台上安装
下载地址为:sourceforge.net/projects/gi…
Linux 平台上安装 Debian/Ubuntu Git 安装命令为:
apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
apt-get install git
git –version
Centos/RedHat
安装命令为:
yum install curl-devel expat-devel gettext-devel \
yum -y install git-core
git --version
配置
全局配置,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
# 别名,以后可以使用st代替status了
git config --global alias.st status
.gitignore 配置忽略文件
新增代码库
在当前目录新建一个Git代码库
git init
新建一个目录,将其初始化为Git代码库
git init [project-name]
下载一个项目和它的整个代码历史
你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin
git clone [url]
远程仓库
GitLab有2中验证方式
-
ssh key,需要提交代码的机器上上生成公钥,可以有多个
-
http,使用平台的用户名和密码
文件管理
从远程仓库更新文件,有几种更新模式:合并、rebase、本地分支为准,在更新前是否将工作区的文件放入stash
git pull
从远程获取最新版本到本地,不会自动merge
git fetch
显示当前分支的版本历史
git log
显示指定文件是什么人在什么时间修改过
git blame file
添加指定文件到暂存区 (多个文件以空格分开)
git add file
显示有变更的文件
git status
添加指定目录到暂存区
git add dir
添加当前目录的所有文件到暂存区
git add .
删除工作区文件,并且将这次删除放入暂存区 (多个文件以空格分开)
git rm file
提交暂存区到仓库区
git commit -m [message]
提交暂存区的指定文件到仓库区 (多个文件以空格分开)
git commit file1 -m [message]
提交工作区自上次commit之后的变化,直接到仓库区
git commit -a
上传本地指定分支到远程仓库
git push [remote] [branch]
强行推送当前分支到远程仓库,即使有冲突
git push [remote] --force
各种撤销
版本
第一种情况,修改了文件,有2种选择
-
使用
git add添加到暂存区 -
使用
git checkout -- <file>撤销文件修改$ git status On branch master Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory)
modified: readme.txtno changes added to commit (use "git add" and/or "git commit -a")
第二种情况,已经使用git add将文件修改保存到暂存区了
此时使用git reset HEAD ...取消暂存
$ git staus
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
操作结果:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
第三种情况,已经commit到本地仓库了,此时不想push,想撤销
git status
(use "git push" to publish your local commits)
一旦commit,本地仓库使用git log便可以看到日志了,这意味着可以看到一串叫revision number的东西:
$ git log
commit d56b0e6ce889b379667ee3d0fc08efd074e0407e (HEAD -> test)
Author: user
Date: Fri Nov 13 14:26:22 2020 +0800
'单测'
d56b0e6ce889b379667ee3d0fc08efd074e0407e就是版本号,一般我们使用前几位即可
git使用SHA1计算出来的16进制数作为版本号,本分支和不同分支的merge,构成了时间线
用HEAD表示当前版本,也就是最新的提交d56b0e6...,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
此时想回滚可以使用:
git reset --hard HEAD^
回退到前3次提交之前
git reset --hard HEAD~3
git reset --hard d56b0e6
第四种情况,已经push了,想撤销
- 重新修改重新提交
- 找到想回滚的日志,使用第三种情况的命令,撤销完成后再push到远端,注意点要加
git push -f,注意-f不能少
分支管理
查看本地分支
git branch
显示所有远程仓库分支
git remote -v
创建分支
git branch <name>
切换分支
git checkout <name>
创建+切换分支
git checkout -b <name>
合并某name分支到当前分支
git merge <name>
删除Dev_xx分支
git branch -d Dev_xx
标签管理
列出已有的tag
git tag -l xx*
新建tag
git tag -a tagName -m "我的tag"
查看tag信息包括commit等
git show tagName
给指定的某个commit号加tag
git tag -a v1.2 9fceb02 -m "my tag"
本地tag推送到远端
git push origin v1.0
本地所有tag推送到远端
git push origin --tags
切换到tag
git checkout tagName
本地删除tag
git tag -d v0.1.2
远端删除tag
git push origin :refs/tags/v0.1.2
常见问题
pull和fetch的区别?
pull = fetch + merge
rebase有什么作用?
把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交也会被修改
合并出现错误fatal: cannot do a partial commit during a merge
致命错误: 在合并期间不能做局部的提交
解决办法: git commit -a 将所有文件提交,再push
复现操作流程:
- 先把分支v1.3.0合并到master;
- 再把master合并到分支v1.3.1(也就是当前分支);
- 解决了合并后的代码冲突.
- 试图提交的时候就出现了开头说的提示.
原因:就是合并代码之后并没有及时的提交
正确的操作方法应该是这样的:
- merge代码
- commit并push
- 解决冲突
- 再commit并push
push失败?
分支 master->devlop->feature
1、当存在ft合入dev的pull request时,提交代码到ft,会被拒绝,变相实现了不允许代码提交的限制
2、封板了, 通过服务端的pre-receive钩子触发方法限制
Your account has been blocked?
使用git 出现 Your account has been blocked 无法从远程pull代码下来,
$ git push origin master
GitLab: Your account has been blocked
fatal: Could not read from remote repository.
解决方案如下:
-
在gitlab管理端代码库,成员,是否被禁用了
-
重新设置下远程url即可
$ git remote set-url origin git@yourhost.com:org/project.git
参考: