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

605 阅读13分钟

git是什么?

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

git的用途

个人理解:

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

git的安装

在windows上安装git

在linux上安装git

github的注册和使用

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

  • 第一种:HTTPS方式

  • 第二种: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

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

当然你也可以找到git的配置文件.gitconfig,进行修改。我的在C:\Users\asus下面,如果找不到可以搜索文件名.gitconfig。

我的以记事本打开是这样的:

[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也就这么多,没必要去深究,会用就行。只要用起来,在实践中学习,会理解更深刻。时间会慢慢解开你的疑惑。

有任何疑问请留言评论。