Git

下载安装

配置

本地创建ssh key

ssh-keygen -t rsa -C "your_email@example.com" 

输入注册的邮箱,之后要求确认路径和输入密码。成功会在~/下生成.ssh文件夹,进去,打开id_rsa.pub,复制里面的key
在github上,进入Account Settings(账户配置),左边选择SSH Keys,Add SSH Key,title填上,粘贴在你电脑上生成的key
验证是否成功,在git bash下输入:

ssh -T git@github.com

You've successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上github

id_rsa文件时私有密钥,id_rsa.pub是公开密钥

然后
本地仓库上传,需要先设置username和email,因为github每次commit都会记录他们

git config --global user.name "Firstname Lastname"
git config --global user.email "your_email@example.com"

这个命令,会在“~/.gitconfig ”中以一下形式输出设置文件

[user]
name = Firstname Lastname
email =your_email@example.com

想要更改这些信息时,可以直接编辑这个设置文件

进入要上传的仓库,右键git bash,添加远程地址

git remote add origin git@github.com:yourName/yourRepo.git

yourName和yourRepo表示在github的用户名和仓库,加完之后进入.git,打开config,这里会多出一个remote "origin"内容,这就是刚才添加的远程地址,也可以直接修改config来配置远程地址
创建新文件夹,打开,然后执行 git init 以创建新的 git 仓库

检出仓库

执行如下命令以创建一个本地仓库的克隆版本:

git clone /path/to/repository 

如果是远端服务器上的仓库,命令会是这个样子:

git clone username@host:/path/to/repository

提高命令输出的可读性

将color.ui设置为去偷可以让命令的输出拥有更高的可读性。

git config --global color.ui auto

"~/.gitconfig"中会增加一行
[color]
ui = auto

GitHub上的头像时通过Gravatar服务显示的。使用过WordPress可能对它有所了解。

许可协议

在GitHub上公开了源代码,也不代表著作者放弃了著作权等权利。代码的权利持有人请选择合适的许可协议。在GitHub上,有修正BSD许可协议、Apache许可协议等多种许可协议供人们选择,不过大多数软件都是用MIT许可协议。MIT的内容可依照著作权者的需求更改内容。MIT许可协议可与其他许可协议并存。MIT条款也是自由软件基金会(FSF)所认可的自由软件许可协议条款,与GPL兼容。

实际使用时,只需将LICENSE文件加入仓库,并在README.md文件中声明使用了何种许可协议即可。

工作流

本地仓库由 git 维护的三棵"树"组成。
第一个是 工作目录,它持有实际文件;
第二个是 暂存区(Index),它像个缓存区域,临时保存改动;
最后是 HEAD,它指向最后一次提交的结果

可以提出更改(把它们添加到暂存区),使用如下命令

git add <filename>
git add *

使用如下命令以实际提交改动

git commit -m '提交信息'

现在,改动已经提交到了 HEAD,但是还没到远端仓库

推送改动

执行如下命令以将这些改动提交到远端仓库

git push origin master

可以把 master 换成你想要推送的任何分支

如果还没有克隆现有仓库,并欲将仓库连接到某个远程服务器,可以使用如下命令添加

git remote add origin <server>

这样就能够将改动推送到所添加的服务器上去了

初始化

git init

Git 使用 git init 命令来初始化一个 Git 仓库
该命令执行完后会在当前目录生成一个 .git 目录

git init newrepo

使用指定目录作为Git仓库.初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。

git add *.c
git add README
git commit -m '初始化项目版本'

以上命令将目录下以 .c 结尾及 README 文件提交到仓库中

git clone <repo>

从现有 Git 仓库中拷贝项目

git clone <repo> <directory>

克隆到指定的目录
repo:Git仓库
directory:本地目录

git ststus -s

git status 命令用于查看项目的当前状态

git add README hello.php

添加文件

git add .

添加所有文件

修改README文件
执行'git status -s'
A表示已添加
AM状态表示,这个文件在我们将它添加到缓存之后又有改动

'git status'查看详细内容
'-s' 参数,简短信息输出

git diff

查看执行 git status 的结果的详细信息
git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别
两个主要的应用场景:
未缓存的改动:'git diff'
查看已缓存的改动: 'git diff --cached'
查看已缓存的与未缓存的所有改动:'git diff HEAD'
显示摘要而非整个 diff:'git diff --stat'

git commit

使用 git add 命令将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中
在此之前要配置名字与电子邮箱地址,Git 为你的每一个提交都记录你的名字与电子邮箱地址

git config --global user.name 'test'
git config --global user.email test@test.com



git commit -m '第一次版本提交'

使用 -m 选项以在命令行中提供提交注释
如果你没有设置 -m 选项,Git 会尝试为你打开一个编辑器以填写提交信息。 如果 Git 在你对它的配置中找不到相关信息,默认会打开 vim

git commit -a

用 -a 选项跳过git add这一步

再次修改一下hello.php

git commit -am '修改 hello.php 文件'



git reset HEAD

用于取消已缓存的内容

改动README,hello.php
两个文件修改后,都提交到了缓存区,现在要取消其中一个的缓存,操作如下:
'''
$ git status -s
M README
M hello.php
$ git add .
$ git status -s
M README
M hello.php
$ git reset HEAD hello.php
Unstaged changes after reset:
M hello.php
$ git status -s
M README
M hello.php
'''
执行 git commit,只会将 README 文件的改动提交,而 hello.php 是没有的
可以使用以下命令将 hello.php 的修改提交:

git commit -am '修改hello.php'

git status

简而言之,执行 git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的缓存

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 Changes not staged for commit 的提示。
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。可以用以下命令完成此项工作

git rm <file>

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f

git rm -f <file>

如果把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 --cached 选项即可

git rm --cached <file>

递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件:

git rm -r *

'git mv'用于移动或重命名一个文件、目录、软连接

git mv README README.md

分支管理

创建分支

git branch (branchname)

除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的

git push origin <branch>

切换分支

git checkout (branchname)

切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录

合并分支

git merge

更新与合并

更新本地仓库至最新改动:

git pull

在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动

要合并其他分支到你的当前分支:

git merge <brancu>

在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功:

git add <filename>

在合并改动之前,可以使用如下命令预览差异:
git diff <source_branch> <target_branch>

分支管理

列出分支

git branch

有一个叫做"master"的分支,并且该分支是当前分支
执行 git init 的时候,缺省情况下 Git 就会为你创建"master"分支

git checkout -b (branchname)

创建新分支并立即切换到该分支下

删除分支

git branch -d(branchname)

合并冲突

可以用 git add 要告诉 Git 文件冲突已经解决

查看提交历史

git log

可以用 --oneline 选项来查看历史记录的简洁的版本

git log --oneline

可以用 --graph 选项,查看历史中什么时候出现了分支、合并。以下为相同的命令,开启了拓扑图选项:

git log --oneline --graph

可以用 '--reverse'参数来逆向显示所有日志

git log --reverse  --oneline

查找指定用户的提交日志可以使用命令:git log --author

git log --author=XiaoMing --oneline --5

要指定日期,可以执行几个选项:--since 和 --before,但是也可以用 --until 和 --after

git log --oneline --before={3.weeks.ago} --after={2019-05-02} --no-merges

三周前且在5月2日之后的所有提交(还用了 --no-merges 选项以隐藏合并提交)

Git 标签

如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签

git tag -a v1.0

-a 选项意为"创建一个带注解的标签"

执行 git log --decorate 时,可以看到标签

git log --oneline --decorate --graph

忘了给某个提交打标签,又将它发布了,可以给它 追加标签

git tag -a v1.0 

查看所有标签

git tag

指定标签信息

git tag -a <tagname> -m "test标签"

PGP签名标签命令

git tag -s <tagname> -m "test标签"

替换本地改动

假如操作失误(这最好永远不要发生),可以使用如下命令替换掉本地改动:

git chekout --<filename>

此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。

假如想丢弃在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将本地主分支指向它:

git fetch origin
git reset --hard origin/master

远程仓库

github
查看当前配置有哪些远程仓库

git remote
git remote -v

加上 -v 参数,可以看到每个别名的实际链接地址

提取远程仓库

从远程仓库下载新分支与数据

git fetch

该命令执行完后需要执行git merge 远程分支到所在的分支

从远端仓库提取数据并尝试合并到当前分支

git merge

在执行 git fetch 之后紧接着执行 git merge 远程分支到你所在的任意分支
假设配置好了一个远程仓库,并且想要提取更新的数据,可以首先执行 git fetch [alias] 告诉 Git 去获取它有你没有的数据,然后你可以执行 git merge [alias]/[branch] 以将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支

在线修改,本地更新

git fentch origin

git merge origin/master

推送到远程仓库

推送新分支与数据到某个远端仓库命令

git push [alias] [branch]

删除远程仓库

git remote rm [别名]

添加仓库 origin2

git remote add origin2 git@github.com:yourname/yourrepo.git

删除仓库 origin2

git remote rm origin2
git remote -v

使用 CODING 仓库

国内用户 GitHub 的访问速度太慢。腾讯云开发者平台。除了提供免费的 Git 仓库之外,免费的私有仓库(免费的普通会员提供 10 个私有项目、512M Git 仓库容量)
将 GitHub 上的代码迁移到 CODING。通常,分为三步:
1、创建 CODING 项目
2、将 GitHub 代码 Pull 到本地
登录 GitHub 选择你想要导入的仓库并复制仓库地址,在本地执行命令,将 GitHub 仓库代码拉下来
3、本地关联 CODING 仓库,Push 代码到 CODING

git remove -v
sudo git remote rm origin
sudo git remotre add origin https://git.codng.net/xxx/xxx.git
sudo git push -u origin master

之后,再次进入 CODING 项目中代码管理的页面,便可以看到刚才 Push 上去的代码了。至此、GitHub 上的项目已经完整迁移到了 CODING 平台

CODING 仓库的免密码 Push/Pull
代码迁移到 CODING 之后,我们发现,每次 Push/Pull 代码的时候都会提示我们输入用户名和密码。这是因为,我们的项目还没有添加 SSH Key,只能通过用户名/密码验证。 而 CODING 是为我们提供了公钥验证的方式的,进入项目管理,在左侧选项卡中点击"公钥部署"按钮,然后点击右侧的"新建公钥部署"
将本地的公钥内容粘贴到对应位置,并且给公钥命名一下...
勾选"授予推送权限"则可以授予这台机器Push代码的权限。
保存好设置后,再次尝试。此时,Push/Pull 代码不在需要验证用户名密码。至此,代码便完全托管在了 CODING 平台上

Git服务器搭建

搭建一台Git服务器作为私有仓库使用。其他人看不到这个项目
以 Centos 为例搭建 Git 服务器

安装Git

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
yum install git

创建一个git用户组和用户,用来运行git服务

groupadd git
useradd git -g git

创建证书登录

收集所有需要登录的用户的公钥,公钥位于id_rsa.pub文件中,把我们的公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
如果没有该文件创建它:

cd /home/git/
mkdir /ssh
chmod 755 .ssh
touch .ssh/authorized_keys
chmod 644 .ssh/authorized_keys

初始化Git仓库

首先选定一个目录作为Git仓库,假定是/home/gitrepo/test.git,在/home/gitrepo目录下输入命令:

cd /home
mkdir gitrepo
chown git:git gitrepo/
cd gitrepo
git init --bare test.git

以上命令Git创建一个空仓库,服务器上的Git仓库通常都以.git结尾。然后,把仓库所属用户改为git:

chown -R git:git test.git

克隆仓库

git clone git@192.168.x.x:/home/gitrepo/test.git

192.168.x.x为 Git 所在服务器 ip
Git 服务器安装完成

~

内建的图形化git:

gitk

彩色git输出:

git config color.iu true

显示历史记录时,每个提交的信息只显示一行:

git config format.pretty oneline

交互式添加文件到暂存区:

git add -i
原文地址:https://www.cnblogs.com/OceanF/p/10803731.html