Git使用指南

241 阅读5分钟

安装

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.txt
    

    no 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

复现操作流程:

  1. 先把分支v1.3.0合并到master;
  2. 再把master合并到分支v1.3.1(也就是当前分支);
  3. 解决了合并后的代码冲突.
  4. 试图提交的时候就出现了开头说的提示.

原因:就是合并代码之后并没有及时的提交

正确的操作方法应该是这样的:

  1. merge代码
  2. commit并push
  3. 解决冲突
  4. 再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
    

参考:

git-scm.com/docs