• Git 使用技巧


    一、Git安装

    1、先去正规网站下载Git:Git下载链接>>>

    2、安装步骤见网站,各种环境的安装>>>,或者百度安装步骤;

    3、TortoiseGit(Git小乌龟),用过svn的同学都知道有个svn小乌龟操作界面,Git也有,安装见百度;

    4、安装好后见图:

     

    下载完毕后,配置`path`环境变量,`E:\develop\git\Git\bin`(我本机的在E盘下)。

    二、使用Git初始化本地仓库并首次提交代码到远程仓库

    首先,登录GitLab,创建一个新项目的私人仓库:

    然后,在本地仓库(就是你写代码文件夹),右键,Git Bash Here,打开Git命令窗口:

    在Git命令窗口输入 git init,初始化本地仓库,初始化完成后,本地仓库文件夹中会出现一个.git文件夹,证明该仓库 已经被git管理了:

    按照如下步骤,添加远程仓库地址,并提交代码:

    1. git add -A src //把src文件夹提交到远程仓库;
    2. git commit -m "首次提交代码,ssm整合" //把代码提交到本地仓库,并备注信息;
    3. git remote add origin 仓库地址 //设置远程仓库地址;
    4. git push -u origin master //提交代码到远程仓库,master分支;

    获取远程仓库地址:

    当提交代码时,可能出现如下错误:

    说明你提交的仓库 origin不存在,我犯的错误是把origin单词拼写错误,导致前后输入命令时找不到该远程仓库,所以提交失败,可以使用使用以下命令解决该问题:

    1. git remote -v //查看远程仓库详细信息,可以看到仓库名称
    2. git remote remove orign //删除orign仓库(我把origin拼写成orign,删除错误名称仓库)
    3. git remote add origin 仓库地址 //重新添加远程仓库地址
    4. gti push -u origin master //提交到远程仓库的master主干

    按照如上步骤操作,即可完成本地仓库使用git初始化,并提交到远程仓库。

    三、GitHub配置SSH Key进行连接

    SSH key的配置基本是我们使用git必备的配置,配置好可以避免频繁的在git push或者git pull的时候输入账号和密码。

    1. https://github.com/xiangshuo1992/preload.git
    2. git@github.com:xiangshuo1992/preload.git

    这两个地址展示的是同一个项目,但是这两个地址之间有什么联系呢?

    前者是https url 直接有效网址打开,但是用户每次通过git提交的时候都要输入用户名和密码,有没有简单的一点的办法,一次配置,永久使用呢?当然,所以有了第二种地址,也就是SSH URL,那如何配置就是本文要分享的内容。

    GitHub配置SSH Key的目的是为了帮助我们在通过git提交代码是,不需要繁琐的验证过程,简化操作流程。

    SSH key的配置步骤是比较简便的,分为5步:

    1、设置git的user name和email
    2、检查是否存在SSH Key
    3、获取SSH Key
    4、GitHub添加SSH Key
    5、验证和修改

    1、设置git的user name和email

    如果你是第一次使用,或者还没有配置过的话需要操作一下命令,自行替换相应字段。

    1. git config --global user.name "username"
    2. git config --global user.email "username@gmail.com"

    说明:git config --list 查看当前Git环境所有配置,还可以配置一些命令别名之类的。

    2、检查是否存在SSH Key

    1. cd ~/.ssh
    2. ls
    3. 或者
    4. ll
    5. //看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key

    如下图:

    如果没有SSH Key,则需要先生成一下:

    ssh-keygen -t rsa -C "username@gmail.com"
    

    执行之后继续执行以下命令来获取SSH Key:

    1. cd ~/.ssh
    2. ls
    3. 或者
    4. ll
    5. //看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key

    3、获取SSH Key

    1. cat id_rsa.pub
    2. //拷贝秘钥 ssh-rsa开头

    如下图:

    4、GitHub添加SSH Key

    GitHub点击用户头像,选择setting:

    新建一个SSH Key:

    取个名字,把之前拷贝的秘钥复制进去,添加就好啦。

    5、验证和修改

    测试是否成功配置SSH Key。

    1. ssh -T git@github.com
    2. //运行结果出现类似如下
    3. Hi ! You've successfully authenticated, but GitHub does not provide shell access.

    之前已经是https的链接,现在想要用SSH提交怎么办?

    直接修改项目目录下 .git文件夹下的config文件,将地址修改一下就好了。

    git地址获取可以看如下图切换。

    经过上面的配置我们的SSH key已经配置完成了,不用在每次都需要输入繁琐的密码了,是不是很舒服。

    四、Git命令使用技巧

    克隆项目到本地,url就是地址;地址有不同格式,例如:https的地址:https://xxx.com/某项目/某项目.git;ssh的地址:git@xxxx.com:xxx/xxx.git。

    1. git config --global user.name "你的大名"
    2. git config --global user.email "你的联系邮件"
    3. # 全局别名设置,有习惯的别名以后,会非常顺手
    4. git config --global alias.st "status"
    5. # 将项目克隆到本地
    6. git clone [url]
    7. #生成公钥 用户连接远程仓库,不用每次都输入账户密码
    8. ssh-keygen -o
    9. #然后都是enter下去.生成的密钥用命令查看,然后配置到远程库,用git@xxx 协议操作
    10. cat ~/.ssh/id_rsa.pub
    11. # 当前工作目录git初始化,将跟踪目录下的文件
    12. git init
    13. # 查看当前及所有分支
    14. git branch
    15. # 将文件添加到暂存区
    16. git add xxx.txt
    17. # 所有变动的文件,并添加到缓存区
    18. git add .
    19. # 查看当前文件内,文件变动状态,是否被暂存
    20. git status
    21. # 查看和对比所有变动的文件,所变动的东西
    22. git diff [可选定某个文件查看]
    23. # 将暂存的文件提交到本地仓库中,并且打个备注,可以多次提交,然后在一起推送到远程仓库中
    24. git commit -m "你的小备注别忘了写"
    25. # 跳过add命令,直接将所有变动的文件提交到本地仓库
    26. git commit -a -m "小备注依然不能忘"
    27. # 删除文件,如果文件已经被add了,则需要在rm后加 -f 就可以删除了
    28. git rm
    29. # 保留文件还存在工作目录中,并且删除暂存.
    30. git rm --cached README
    31. # 查看提交历史, 可以格式化查看,这个要自己写格式化样式...
    32. git log
    33. # 放弃所有更改,或者某个文件的更改
    34. git checkout [.|fname]
    35. # 查看当前工作目录的远程仓库
    36. git remote
    37. # 添加远程仓库 <别名> <地址>
    38. git remote add < shortname > < url >
    39. # 推送代码到远程仓库的当前分支,一般选择分之后,命令可以省略分支
    40. git push <分支>
    41. # 将远程仓库的代码拉更新到本地仓库
    42. git pull
    43. # 将<目标分支>的变动合并到当前分支上
    44. git merge <目标分支>
    45. # 保存本地仓库的账号
    46. git config --local credential.helper store
    47. # 保存git全局账号
    48. git config --global credential.helper store

     git  init 创建好了本地git仓库,会发现在test目录中多了一个.git目录,并且这个目录是隐藏的。

    提交文件到中转站和仓库(add和commit)

    git add 告诉git 将文件添加到仓库等等提交(也可以认为添加到了仓库中转站)没有任何输出表示正确添加到中转站。

    git commit -m "wrote a readme file" ,告诉git 将刚才放置在中转站的提交到仓库 并给这个提交动作附上一个标签。

    注意:

    为什么提交要用add和commit   因为可以add多个文件到中转站,一次commit就可以将中转站中的文件提交到仓库。

    1. $ git add file1.txt
    2. $ git add file2.txt file3.txt
    3. $ git commit -m "add 3 files."

     git status和git diff

    一般步骤为,检查init的git仓库的文件是否有修改 git status ;如果有修改就查看修改的地方是不是正确的 git diff ;如果修改正确的就提交的中转站 git add ;不清楚是否正确提交到中转站 git status ;如果正确就再提交到仓库确保代码正常 git commit -m "string"。

    1. $ git status #查看init仓库所有文件的状态,即查看当前文件test目录中的所有文件的状态(未修改/修改/更新)包括中转站中的文件状态
    2. On branch master
    3. Changes not staged for commit:
    4. (use "git add ..." to update what will be committed)
    5. (use "git checkout -- ..." to discard changes in working directory)
    6. modified: readme.txt # 红色表示此文件被修改
    7. no changes added to commit (use "git add" and/or "git commit -a")
    1. $ git diff readme.txt #查看被修改的文件,修改了哪些东西
    2. diff --git a/readme.txt b/readme.txt #比较修改前和修改后的文件
    3. index d8036c1..53d4271 100644
    4. --- a/readme.txt
    5. +++ b/readme.txt #在readme.txt中做了增加操作
    6. @@ -1,2 +1,2 @@
    7. -Git is a version control system.
    8. -Git is free software.
    9. \ No newline at end of file
    10. +Git is a distributed version control system.
    11. +Git is free software.

     

    add遇到的问题

    1. $ git add file1.txt
    2. warning: LF will be replaced by CRLF in test.txt.
    3. The file will have its original line endings in your working directory.

    LF是linux下的换行符,而CRLF是enter + 换行。

    当创建文档的时候使用的环境是windows,而git运行环境在linux环境。

    解决方式:

    git config --global core.autocrlf false

    git的快照commit

    假如的改动到现在已经提交了三个版本的readme.txt到.git仓库:

    1. 版本1:wrote a readme file
    2. Git is a version control system.
    3. Git is free software.
    4. 版本2add distributed
    5. Git is a distributed version control system.
    6. Git is free software.
    7. 版本3:append GPL
    8. Git is a distributed version control system.
    9. Git is free software distributed under the GPL.

    查看git的快照commit,需要使用git log:

    类似每次快照都要产生log文件,需要用git log来查看快照,git log是按照最新到最旧来显示。

    如下:

    1. $ git log
    2. commit f78cd0925b2bc2883d7ed4de49b1a851367ae56d #这一串数字代表快照的id号,由SHA1产生
    3. Author: userlhb <lhb@lhb.com>                
    4. Date: Sat Mar 26 20:23:52 2016 +0800 #最新的commit快照 也叫做HEAD快照
    5. append GPL
    6. commit 96829291d720b3b84d0ab2a5aad89b0af97a1394
    7. Author: userlhb <lhb@lhb.com>
    8. Date: Sat Mar 26 16:20:13 2016 +0800
    9. add distributed #这是HEAD快照的前一个快照 用HEAD^表示
    10. commit 51af5b36b85c52e86b6140d3a73b5e22cd3f78da
    11. Author: userlhb <lhb@lhb.com>
    12. Date: Sat Mar 26 15:36:57 2016 +0800 #最旧的commit快照
    13. wrote a readme file #这是HEAD快照的前前一个快照 用HEAD^^表示,问题来了?如果前前一百个,怎么表示? HEAD~100

    或者显示为一行,添加--pretty=oneline:

    1. $ git log --pretty=oneline
    2. f78cd0925b2bc2883d7ed4de49b1a851367ae56d append GPL
    3. 96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
    4. 51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file

    git中实现版本回退使用git reset

    先看下面两幅图:

    git reset 可以控制指针 HEAD 在不同的快照直接切换,如果需要切换到上一个快照用git reset --hard HEAD^。

    git reset 和 git commit -m "string" 的动作会被记录到git reflog中,使用git reflog可以查看记录。

    git log 查看所有提交到版本库中的快照(版本)。

     回退到中间那个版本add disributed:

    1. $ git log --pretty=oneline #列出.git仓库中的所有版本号
    2. f78cd0925b2bc2883d7ed4de49b1a851367ae56d append GPL
    3. 96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
    4. 51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file
    5. $ git reset --hard HEAD^ #回退到前一个版本add distributed
    6. Unstaged changes after reset:
    7. M readme.txt
    8. $ git log --pretty=oneline #查看是否回退到add distributed,不能查看之前的版本。
    9. 96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
    10. 51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file

    有没有发现什么?对,回退到add distributed后,不能查看之前的版本。要是又要回退到最开始那个版本怎么办呢?

    解回退到仓库中最新的那个版本:因为 git reflog 能记录 git reset和git commit -m "string"的动作,所以可以使用git reflog来查看每个动作的id号,然后通过id号回退到最新的那个版本append GPL。

    1. $ git reflog #罗列出所有的HEAD动作
    2. 9682929 HEAD@{0}: reset: moving to HEAD^
    3. f78cd09 HEAD@{1}: commit: append GPL #append GPL 的id是 f78cd09
    4. 9682929 HEAD@{2}: commit: add distributed
    5. 51af5b3 HEAD@{3}: commit (initial): wrote a readme file
    6. $ git reset --hard f78cd09 #移动HEAD指针到 f78cd09 即 append GPL
    7. $ git log --pretty=oneline #查看是否切换到append GPL 这个版本
    8. f78cd0925b2bc2883d7ed4de49b1a851367ae56d append GPL
    9. 96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
    10. 51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file

    我们利用上述指令,在往demo文件夹中添加一个b.txt文件,然后通过`git log`查看我们的操作记录,然后可以查询到我们添加a.txt和b.txt的log日志,然后通过`git reset --hard b96f962d0f835e3114b6f51bf7c9bfe6125626e3`,去回退到我们的操作节点,此时我回退到第一次添加文件节点,也就是demo文件夹只有一个a.txt文件,以下是git端的效果截图:

    此时查看`git log` 结果发现只有一条操作记录,也就是我们添加的a.txt的记录,我们之前进行的第二步操作呢?也就是添加的b.txt文件节点时,我们如何回退到最后这个节点呢?我们可以利用`git reflog`:

    此刻demo文件夹中的2个文件内容,a.txt文本如下:

    初始化内容  

    b.txt文本内容如下:

    这是b文本内容  

    我们继续为b.txt添加如下记录信息

    我们临时为b添加记录  

    此刻b.txt文件内容如下:

    1. 这是b文本内容  
    2. 我们临时为b添加记录  

    上述意思就是在更新`b.txt`文件内容,添加操作记录如果用到开发场景,我们在**需求1**,然而由于工作需要,**需求1**需要暂且搁置,我们需要做**需求2**,**需求1**代码需要砍掉,等我们做完**需求2**,我们继续需要获取我们之前**需求1**的代码,我们可以利用`git stash`命令,以下是该命令的含义:

    1. git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
    2. git stash list 查看“某个地方”存储的所有记录
    3. git stash clear 清空“某个地方”
    4. git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
    5. git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
    6. git stash drop 编号,删除指定编号的记录

    这次会有冲突,我们需要解决冲突,即可。

    Git分支管理

    1. 切换到项目位置。

    2. 创建一个项目的一新分支。

    1. mike@win10-001 MINGW64 ~/cookbook/cookbook (master)
    2. $ git branch first-branch

    3. 切换到新建的分支下。

    1. mike@win10-001 MINGW64 ~/cookbook/cookbook (master)
    2. $ git checkout first-branch
    3. Switched to branch 'first-branch'
    4. mike@win10-001 MINGW64 ~/cookbook/cookbook (first-branch)

    4. 第2步和第3步可以合并成一步。

    1. mike@win10-001 MINGW64 ~/cookbook/cookbook (first-branch)
    2. $ git checkout -b first-branch

    5. 改变文件的内容。

    1. mike@win10-001 MINGW64 ~/cookbook/cookbook (first-branch)
    2. $ echo "Change" >> README.md

    6. 提交这个改变

    1. $ git commit -a -m 'Readme changed'
    2. warning: LF will be replaced by CRLF in README.md.
    3. The file will have its original line endings in your working directory.
    4. [first-branch dc7b6d5] Readme changed
    5. 1 file changed, 1 insertion(+)

    7. 推送分支到gitlab服务器

    1. mike@win10-001 MINGW64 ~/cookbook/cookbook (first-branch)
    2. $ git push -u origin first-branch
    3. Counting objects: 3, done.
    4. Writing objects: 100% (3/3), 262 bytes | 131.00 KiB/s, done.
    5. Total 3 (delta 0), reused 0 (delta 0)
    6. remote:
    7. remote: To create a merge request for first-branch, visit:
    8. remote: http://gitlab.aishangwei.net/root/cookbook/merge_requests/new?merge_request%5Bsource_branch%5D=first-branch
    9. remote:
    10. To gitlab.aishangwei.net:root/cookbook.git
    11. * [new branch] first-branch -> first-branch
    12. Branch 'first-branch' set up to track remote branch 'first-branch' from 'origin'.

    8. 切换到master分支。

    1. $ git checkout master
    2. Switched to branch 'master'
    3. Your branch is up to date with 'origin/master'.

    9. 合并first-branch分支到master分支。

    $ git merge first-branch –no-ff

    在我们保存和关闭编辑器的时候,这个分支将会合并,具体信息如下:

    1. mike@win10-001 MINGW64 ~/cookbook/cookbook (master)
    2. $ git merge first-branch --no-ff
    3. Merge made by the 'recursive' strategy.
    4. README.md | 1 +
    5. 1 file changed, 1 insertion(+)

    10. 推送改变到Gitlab上的master。

    1. mike@win10-001 MINGW64 ~/cookbook/cookbook (master)
    2. $ git push origin master
    3. Counting objects: 1, done.
    4. Writing objects: 100% (1/1), 223 bytes | 223.00 KiB/s, done.
    5. Total 1 (delta 0), reused 0 (delta 0)
    6. To gitlab.aishangwei.net:root/cookbook.git
    7. 53ec2ca..5e1ebdd master –> master

    11. 删除所创建的分支。

    1. mike@win10-001 MINGW64 ~/cookbook/cookbook (master)
    2. $ git push origin --delete first-branch
    3. To gitlab.aishangwei.net:root/cookbook.git
    4. - [deleted] first-branch

    我们可以通过`git branch` 查看我们的项目所有分支,默认只有一个`master`主分支,我们可以通过`git branch dev`(dev是我们起的分支名)新建一个分支,名字是dev开发分支,然后通过`git checkout dev`切换到我们新建的dev分支,我们也可以通过`git checkout -b 分支名`一并实现创建、切换分支的功能。

    我们切换到`dev`分支,通过`touch 文件名`创建一个文件,然后add、commit ,意思就是在dev分支上做一些修改,并保存在dev分支上,然后在切回master分支,我们要做的就是将dev上更新的内容,也在master上做同样的修改,我们可以用`git merge` 分支名,将dev上的更新内容,合并到master上另外删除分支使用`git branch -d 分支名`。

    利用`github`创建项目,会出现如下指令,需要在git终端输入创建生成项目,要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行 git remote add [shortname] [url]:

    通过`git remote add origin 和https://github.com/iyongfei/test.git`。

     

    接下来我们通过`git clone https://github.com/iyongfei/test.git`来`clone`下载我们的`github`项目,我们默认拉取的是`master`分支(默认分支可以在**github**设置其他分支)。

    然后根据以前的git指令,进行`git add .` 和 `git commit -m "备注信息"`。

    注意注意,由于项目开发都是协同开发,我们在接下来在提交代码之前,需要`git pull origin 分支`,拉取对应分支代码,然后如果有冲突解决冲突,然后在`git push origin 分支名`。

    ps:我如下的截图在提交代码时,为了简化操作,没有`git pull` 。

    我们还可以往`github`项目上添加新分支,我们通过`git branch 分支`创建分支,通过`git checkout 分支`切换分支,(或者通过`git checkout -b 分支`,创建并切换分支),然后在添加、提交(我这里没有添加任何信息),最后`git push origin dev` 往github项目上添加新分支

    我们还可以拉取其他分支的内容到本分支,比如我在`master`上添加内容,然后我在`dev`分支上去拉取`master`上的代码,然后在提交到对应的github分支`dev`上(我本地依然没有添加额外的内容)。

    冲突如何产生?我们如何解决冲突?当自己拉取了`dev`的代码,同事也拉取了`dev`的代码,同事先于我提交代码,然后自己也在本地修改了代码,如果修改了同一个文件,会出现冲突情况,再次拉取`dev`代码会失败,而且提交失败。

    解决方式一:先在自己本地`dev`,通过`git stash`暂存修改,然后`git pull 分支`代码,再然后`git stash pop` 合并代,解决冲突(删掉我们不需要的代码),然后在提交代码:

    1. <<<<<<< Updated upstream
    2. aa为各个
    3. bb额外分
    4. =======
    5. aac
    6. bbd
    7. >>>>>>> Stashed changes

    解决方式二:不利用`git stash`,利用`compare`对比软件,将有冲突的文件,剪切出来,然后拉取`dev`分支代码,就把github的`dev`分支最新代码,同步下来,然后在跟自己的剪切出来的代码段,进行对比,将自己的代码更新到同步下来的代码,然后在提交到github对应的分枝上。

    五、Git常见错误解决

    1、error: src refspec master does not match any解决办法

    原因分析:

    引起该错误的原因是目录中没有文件,空目录是不能提交上去的。

    解决办法:

    1. $ touch README
    2. $ git add README
    3. $ git commit –m’first commit’
    4. $ git push origin master

    2、fatal: unable to connect to eagain.net

    问题产生:

    使用git clone 命令从 eagain.net 克隆gitosis.git源码出错。

    解决办法:

    git clone git://github.com/res0nat0r/gitosis.git

    3、通过http协议clone出错

    解决办法:

    在git服务器上要提供的项目下面执行:

    git update-server-info

    4、centos5.8下面安装gitweb的默认路径问题

    问题产生:

    在centos下使用yum install gitweb 命令安装gitweb后找不到gitweb的默认安装路径。

    原因分析:

    网络上的说法默认路径是 /var/www/git ,但是在我的centos虚拟机中,安装完gitweb后,默认路径是/usr/share/gitweb。

    解决办法:

    由于按网上的说法,找不到gitweb的默认安装路径,我使用了find 命令,用来查找gitweb所在的目录。

    5、安装gitosis时使用python3.3.0执行python setup.py install 报错

    问题产生:

    在安装gitosis的时候,需要预先安装工具包python-setuptools,安装命令比较简单:

    yum install python-setuptools

    但是在clone了gitosis代码,执行python安装命令的时候报错,错误提示如下:

    ImportError: No module named setuptools

    原因分析:

    centos默认的python版本是2.4.3,因为一次机会我升级了python的版本到3.3.0,这样就出现了错误。

    解决办法:

    我的办法是降低了python的版本,有兴趣的同学可以尝试安装distribute包,看能不能解决这个问题。

    6、git push origin master 到github出错

    问题产生:

    本地项目添加了远程仓库,但是在推送代码到远程仓库的时候,报无法连接到远程服务器。

    原因分析:

    github和本地代码做推送和拉取时,需要用到ssh的密钥对进行数据加解密,由于github上新建的项目没有添加密钥,所以本地仓库连接不到远程仓库。

    解决办法:

    在github上为该项目添加公钥,推荐做法是不要单独为每个项目添加公钥,而是直接通过github帐号的ssh信息维护开发机的ssh公钥。

  • 相关阅读:
    Docker——本文来自AI创作助手
    Debezium系列之:深入理解Kafka的消息代理
    宇视摄像机防水施工方法
    linux下usleep函数对CPU占用率的影响
    Python---数据容器分类及通用操作
    Mac 如何安装Redis
    剑指 Offer 12. 矩阵中的路径
    idea配置tomcat,解决控制台乱码问题
    ReactNative
    Python项目实战:制作一个翻译软件
  • 原文地址:https://blog.csdn.net/qq_35029061/article/details/126198635