用git管理你的项目吧(最全的干货)

git是什么?

Git是一个开源的分布式版本控制系统,能够有效、高速的处理从很小到很是大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。html

git的用途

我的理解:linux

  • git是一个很是好的多人协做的工具,并且功能也十分强大。
  • 对于我的来讲,git是管理你写的大大小小项目的一个工具,你能够把你写的笔记、代码上传到远程仓库,也能够在远程仓库clone别人写的项目查看别人写的笔记。官方远程仓库github,也有国内仓库码云。

git的安装

在windows上安装gitgit

在linux上安装gitgithub

github的注册和使用

github适合我的使用,这里我只讲述链接远程仓库的两种方式。vim

  • 第一种:HTTPS方式windows

  • 第二种:SSH方式,对于初学者,不知道ssh在哪里,个人在C:\Users\asus.ssh,找到id_rsa.pub,以记事本的方式打开复制,登陆到本身的github,点击右上角的头像,再点击Settings,找到SSH and GPK keys 点击 ,右上角有个New SSH key 的按钮点击,随便填一个Title,再把你刚才复制的东西粘贴到Key框里,而后点击Add SSH key,就能够用SSH克隆项目了。 (若是找不到.ssh,在计算机里搜索)缓存

git配置全局变量

配置用户名邮箱:

git config --global user.name stefan
git config --global user.email 502681863@qq.com
复制代码

这样你提交的远程分支就显示你的信息了。bash

固然你也能够找到git的配置文件.gitconfig,进行修改。个人在C:\Users\asus下面,若是找不到能够搜索文件名.gitconfig。服务器

个人以记事本打开是这样的:app

[user]
	name = Stefan
	email = 502681863@qq.com
	signingkey = stefan0712
[credential]
	helper = manager
[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	process = git-lfs filter-process
	required = true
[color]
	ui = true
[alias]
	st = status
	cm = commit -m
	ck = checkout
	plo = pull origin
	ps = push
	a =add .
复制代码

刚才以命令设置的name和email都在这个文件里。

git使用逻辑

我的使用:

想把本地的一个项目上传到github,而且以前也没有与远程有管理。

步骤:

  1. 打开项目文件夹,右击选中Git Bush Here,打开git命令框,输入git init 即把当前的目录变成能够管理的git仓库,生成隐藏.git文件。
  2. 在github里新建一个项目,复制HTTPS地址或者SSH地址
  3. 在git命令里输入git remote add origin https://github.com/StefanPython/demo.git与远程新建的项目创建链接。
  4. 查看远程库的信息,输入命令git remote,显示origin就证实创建链接成功。
  5. 如今就能够上传项目到远程仓库了,git status 查看文件在git仓库中的状态,显示红色说明文件还在本地工做区
  6. 命令行输入git add . 将全部的文件添加到暂存区,如今git status 文件显示绿色。
  7. 命令行输入git commit -m "新建什么,修改什么",这样就是把文件提交到版本库
  8. git push -u origin master 将项目推送到远程仓库(同时也将本地分支master推送到远程),登上github打开刚新建的项目,刷新就会出现你推送的东西。(第一次推送要加-u,这样之后就能够直接git push,不用再加 origin master)
  9. 实际工做中对本地项目的修改再推送到远程就是重复5-8的步骤

在远程先创建一个项目,把空项目clone到本地

步骤:

  1. 在github上新建一个空项目,复制HTTPS或者SSH
  2. 在本地盘中随便找一个地方右键打开git命令窗,输入git clone git@github.com:StefanPython/demo.git 本地就会出现一个和远程同样的项目,而且已经和远程创建了来接。
  3. 如此就可使用命令
git status
git add .
git commit -m "修改"
git push(这里是直接能够push的,由于把远程master也克隆下来了)
复制代码

多人协做

多人协做和我的协做的最大区别是,多我的在一个分支下提交,这就避免不了有冲突。我的使用的时候应该是几乎不会出现冲突。

多人协做步骤:

  1. 新建项目,默认有一个主分支master,还要新建一个develop分支,简称dev,通常都是在dev分支下工做的,到最后项目测试基本完成,要发布了,就把dev分支下的项目合并到master分支上。master分支基本不作改动,只作项目版本的更新。
  2. 让每个协做者克隆远程项目到本地,天然也就克隆了master分支和dev分支,切换到dev分支下进行工做。
  3. 有时候别人修改了一个地方已经提交到远程了,本身也修改了一样的地方,本身也要push时却失败了,这是由于远程项目的版本是最新的,可能和你修改的有冲突,因此每次push前先git pull ,把远程下拉后解决冲突再push就能够成功了。
  4. 固然你也能够在本地创建一个本身的分支dev_name,平时工做在本身分支下工做,等要push到远程的时候就切换到dev分支下git merge dev_name 把dev_name 下的代码合并到dev下就能够了。
git checkout dev(切换到dev分支)
git status
git add .
git commit -m "修改"
git pull origin dev
git push

git checkout –b dev_xfy(建立并切换到dev_xfy分支下)
git checkout dev
git merge dev_xfy(合并dev_xfy到dev)
git pull origin dev
git push
复制代码

解决冲突:

当两个分支在同一个文件的同一个位置作了修改时,两者合并时会出现冲突,查看冲突,留下正确的修改,从新 git add b.txt git commit -m'冲突已解决'。

其实解决冲突也很简单,当冲突出现时,git status 会告诉你哪些文件有冲突(显示红色的文件),在项目中找到相应的文件 看到相似的

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> dev_xfy
复制代码

Git用<<<<<<<,=======,>>>>>>>标记出不一样分支的内容,咱们把这些标记删掉,留下正确的代码就能够了。

码云的使用

为何要使用码云呢,由于码云是中文的,而且它更适合多人协做,一个组织的管理。

一样的使用方法和github很相似,首先得注册一个码云帐号。接下来就是配置SSH,和github过程基本同样。

git经常使用命令总结:

mkdir:         XX (建立一个空目录 XX指目录名)
&emsp;&emsp;pwd:          显示当前目录的路径。
&emsp;&emsp;git init          把当前的目录变成能够管理的git仓库,生成隐藏.git文件。
&emsp;&emsp;git add XX       把xx文件添加到暂存区去。
&emsp;&emsp;git commit –m “XX”  提交文件 –m 后面的是注释。
&emsp;&emsp;git status        查看仓库状态
&emsp;&emsp;git diff  XX      查看XX文件修改了那些内容
&emsp;&emsp;git log          查看历史记录
&emsp;&emsp;git reset  --hard HEAD^ 或者 git reset  --hard HEAD~ 回退到上一个版本
&emsp;&emsp;(若是想回退到100个版本,使用git reset –hard HEAD~100 )
&emsp;&emsp;cat XX         查看XX文件内容
&emsp;&emsp;git reflog       查看历史记录的版本号id
&emsp;&emsp;git checkout -- XX  把XX文件在工做区的修改所有撤销。
&emsp;&emsp;git rm XX          删除XX文件
&emsp;&emsp;git remote add origin https://github.com/StefanPython/demo.git 关联一个远程库
&emsp;&emsp;git push –u(第一次要用-u 之后不须要) origin master 把当前master分支推送到远程库
&emsp;&emsp;git clone https://github.com/tugenhua0707/testgit  从远程库中克隆
&emsp;&emsp;git checkout –b dev  建立dev分支 并切换到dev分支上
&emsp;&emsp;git branch  查看当前全部的分支
&emsp;&emsp;git checkout master 切换回master分支
    git branch -m newname 修改当在分支
    git branch -m oldname newname 修改其余分支名字
&emsp;&emsp;git merge dev    在当前的分支上合并dev分支
&emsp;&emsp;git branch –d dev 删除dev分支
&emsp;&emsp;git branch name  建立分支
&emsp;&emsp;git stash 把当前的工做隐藏起来 等之后恢复现场后继续工做
&emsp;&emsp;git stash list 查看全部被隐藏的文件列表
&emsp;&emsp;git stash apply 恢复被隐藏的文件,可是内容不删除
&emsp;&emsp;git stash drop 删除文件
&emsp;&emsp;git stash pop 恢复文件的同时 也删除文件
&emsp;&emsp;git remote 查看远程库的信息
&emsp;&emsp;git remote –v 查看远程库的详细信息
&emsp;&emsp;git push origin master  Git会把master分支推送到远程库对应的远程分支上
    git branch --merged显示已经所有合并到当前分支的分支
    git branch --no-merged显示没有合并到当前分支的分支
      若是要丢弃一个没有被合并过的分支,能够经过git branch -D <name>强行删除。

复制代码
查看日志:
                git log
                有更好的格式 git log --pretty=oneline
                查看全部操做日志git reflog
版本回退:
                git reset --hard head^ 回到上一个版本
                git reset --hard 版本号 想回到的版本号
                得到版本号的命令 git reflog
撤销上一次的修改(未提交的而且是在缓存区的):
                git checkout  -- 文件名  在暂存区修改文件未提交,可用此命令撤销当前未提交的修改,若是有多个文件修改须要撤销  git checkout -- .
                git reset --hard head 定位到当前提交状态指针,当一个暂存区文件修改后未提交时等同于git checkout -- 文件名
     注意:命令git checkout -- readme.txt 中的 -- 很重要,若是没有 -- 的话,那么命令变成建立分支了。
               只要没有commit均可以还原
链接远程仓库:
                  git remote add origin1 https://github.com/xfy007/gitsecond.git  添加测试用的远端仓库
                  git push -u origin1 master  每次咱们要提交代码到服务器上时,都会使用到git push。git push命令会有两个参数,远端仓库的名字,以及分支的名字
                 因为远程库是空的,咱们第一次推送master分支时,加上了 –u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在之后的推送或者拉取时就能够简化命令。经后可直接git push
从远程仓库克隆:
               git clone https://github.com/xfy007/gitsecond.git

总结建立与合并分支命令以下:
&emsp;&emsp;          查看分支:git branch
&emsp;&emsp;          建立分支:git branch name
&emsp;&emsp;          切换分支:git checkout name
&emsp;&emsp;          建立+切换分支:git checkout –b name
&emsp;&emsp;          合并某分支到当前分支:git merge name
&emsp;&emsp;          删除分支:git branch –d name

保存工做现场:
        当一个分支上的工做还没完成,不能提交时,可是有一个bug须要我再主分支上新建一个分支去解决,因此用到
        git  stash 来保存工做现场
        git status 查看没有未提交的工做
        要恢复工做现场 方法一:git stash pop (恢复并删除stash内容)法二:git stash apply(恢复)   , git stash drop(一个个删除)
查看SSH公钥的相关命令:
ssh-keygen  从新生成SSH公钥
cd ~/.ssh 切换到.ssh目录下
ll -a 查看.ssh下有哪些文件
cat ~/.ssh/id_rsa.pub  查看ssh  key
复制代码

注:命令无须强记,多使用,就会熟练。

为git命令设置别名:

每次输那么长的命令,感受效率很低,也很麻烦。能够把这些长命令设置别名。

如: git status 设置成 git st

git add . 设置成git a

git commit -m 设置成 git cm

有命令修改别名可是一个一个修改好麻烦,你能够再次找到.gitconfig文件,打开,找到[alias]标签,以下

[alias]
	st = status
	cm = commit -m
	ck = checkout
	plo = pull origin
	ps = push
	a =add .
复制代码

照这个样子修改就好了。

能够从git里打开.gitconfig文件 命令以下

cd
cat .gitconfig
vim .gitconfig  (进入vim编辑器)
在英文输入法下按i,进入输入模式,修改完成后,在英文输入法下点ESC,在点shift+:底部就会出现一个:,输入wq,就保存退出了
再经过cat .gitconfig查看是否修改

复制代码

git 相关概念的理解:

工做区:

将一个文件夹经过git init 设置成一个git能够管理的文件夹时,这个文件夹里的内容就是工做区。

暂存区:

暂存区,叫stage 或者 index ,是用来暂时存放工做区中修改的内容; 能够理解为一个中转站

版本库:

经过git init 会生成一个隐藏的文件.git,这个,git里的东西就是版本库

master:

master是主分支,当咱们git init后,并不会马上产生master, 而是咱们添加了一个文件,并git add .,git commit后, 这时咱们查看分支状况, 即可以看到master分支了。(分支都存放在.git/head/refs目录下)

HEAD:

HEAD是一个引用,引用的是当前的分支, 若是当前处于master分支,那么HEAD就会指向master。

注:对三个区(工做区,暂存区、版本库)有影响的几个命令

git add   当咱们使用git add 指令时,就是将对应修改的文件添加到暂存区中
这时,暂存区中的目录树被更新。

git commit 咱们使用git commit指令,便会将暂存区中作出的修改提交到版本库中
这时master指向的分支被更新。

git reset HEAD  当使用git reset HEAD 指令时,版本库的内容会回退到暂存区。

git checkout --file 使用git checkout --file时,是将工做区指定修改的文件被暂存区的内容覆盖(消除全部工做区进行的改动),这个动做很危险。
git checkout . 也是如此,该指令是将全部修改的文件被暂存区的内容覆盖。

git rm --cached 使用git rm --cached file时,直接从暂存区进行文件的删除,不会影响工做区的内容。

git checkout HEAD --file git checkout  HEAD --flie 时,会将版本库中的对应的文件内容直接替换工做区和暂存区中的该文件。
这个动做也是危险的,一样git checkout HEAD . 是将全部的内容替换工做区和暂存区的文件。
复制代码

查看三个分区的区别:

git diff 查看工做区和暂存区的区别
git diff --cached 查看暂存区和版本库之间的区别
git diff HEAD 查看工做区和版本库之间的区别
git status 查看当前的工做状态
复制代码

学到最后,其实仍是云里雾里的,先不急,一个git也就这么多,不必去深究,会用就行。只要用起来,在实践中学习,会理解更深入。时间会慢慢解开你的疑惑。

有任何疑问请留言评论。

相关文章
相关标签/搜索