当前位置: 首页 > 新闻中心 > 一篇文章让你完全掌握使用git推送代码到新版gitcode

一篇文章让你完全掌握使用git推送代码到新版gitcode

发布时间:2024-03-29 10:16:06

  1. 怎么通过git把代码上传到github上
  2. Git不要只会pull和push,试试这5条提高效率的命令

一、怎么通过git把代码上传到github上

  这是我第一次应用git,以下仅供git的初学者参考。

github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开。这对于一般人来说公共仓库就已经足够了。

1.注册账户以及创建仓库

要想使用github第一步当然是注册github账号了。之后就可以创建仓库了(免费用户只能建公共仓库),create a new repository,填好名称后create,之后会出现一些仓库的配置信息,这也是一个git的简单教程。

2.安装客户端tortoisegit

github是服务端,要想在自己电脑上使用git我们还需要一个git客户端,我这里选用tortoisegit,他给我们提供了图形界面的操作。在安装之前首先需要安装git,下载地址http://msysgit.github.com/,tortoisegit下载地址:

http://code.google.com/p/tortoisegit/

装完后右键鼠标会多出一些选项来,在本地仓库里右键选择git init here,会多出来一个.git文件夹,这就表示本地git创建成功。右键git bash进入git命令行,为了把本地的仓库传到github,还需要配置ssh key。

3.配置git

(1) 首先在本地创建ssh key;

$ ssh-keygen -t rsa -c "your_email@youremail.com"

后面的your_email@youremail.com改为你的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在~/下生成.ssh文件夹,进去,打开id_rsa.pub,复制里面的key。回到github,进入account settings,左边选择ssh keys,add ssh key,title随便填,粘贴key。

(2)为了验证是否成功,在git bash下输入:

$ ssh -t git@github.com

如果是第一次的会提示是否continue,输入yes就会看到:you’ve successfully authenticated, but github does not provide shell access 。这就表示已成功连上github。

(3)接下来我们要做的就是把本地仓库传到github上去,在此之前还需要设置username和email,因为github每次commit都会记录他们。

$ git config --global user.name "your name"

$ git config --global user.name "your name"$ git config --global user.email "your_email@youremail.com"

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

$ git remote add origin git@github.com:yourname/yourrepo.git

后面的yourname和yourrepo表示你再github的用户名和刚才新建的仓库,加完之后进入.git,打开config,这里会多出一个remote “origin”内容,这就是刚才添加的远程地址,也可以直接修改config来配置远程地址。

4.提交、上传

(1)接下来在本地仓库里添加一些文件,比如readme,

$ git add readme

$ git add readme$ git commit -m "first commit"

(2)上传到github:

$ git push origin master

git push命令会将本地仓库推送到远程服务器。

git pull命令则相反。

修改完代码后,使用git status可以查看文件的差别,使用git add 添加要commit的文件,也可以用git add -i来智能添加文件。之后git commit提交本次修改,git push上传到github。

5.gitignore文件

.gitignore顾名思义就是告诉git需要忽略的文件,这是一个很重要并且很实用的文件。一般我们写完代码后会执行编译、调试等操作,这期间会产生很多中间文件和可执行文件,这些都不是代码文件,是不需要git来管理的。我们在git status的时候会看到很多这样的文件,如果用git add -a来添加的话会把他们都加进去,而手动一个个添加的话也太麻烦了。这时我们就需要.gitignore了。比如一般c#的项目我的.gitignore是这样写的:

bin

.suo

obj

bin和obj是编译目录,里面都不是源代码,忽略;suo文件是vs2010的配置文件,不需要。这样你在git status的时候就只会看到源代码文件了,就可以放心的git add -a了。

二、Git不要只会pull和push,试试这5条提高效率的命令

使用 git 作为代码版本管理,早已是现在开发工程师必备的技能。可大多数工程师还是只会最基本的保存、拉取、推送,遇到一些commit管理的问题就束手无策,或者用一些不优雅的方式解决。

本文分享我在开发工作中实践过的实用命令。这些都能够大大提高工作效率,还能解决不少疑难场景。下面会介绍命令,列出应用场景,手摸手教学使用,让同学们看完即学会。

官方文档

git 教程

stash 命令能够将还未 commit 的代码存起来,让你的工作目录变得干净。

我猜你心里一定在想:为什么要变干净?

应用场景:某一天你正在 feature 分支开发新需求,突然产品经理跑过来说线上有bug,必须马上修复。而此时你的功能开发到一半,于是你急忙想切到 master 分支,然后你就会看到以下报错:

因为当前有文件更改了,需要提交commit保持工作区干净才能切分支。由于情况紧急,你只有急忙 commit 上去,commit 信息也随便写了个“暂存代码”,于是该分支提交记录就留了一条黑 历史 ...(真人真事,看过这种提交)

如果你学会 stash,就不用那么狼狈了。你只需要:

就这么简单,代码就被存起来了。

当你修复完线上问题,切回 feature 分支,想恢复代码也只需要:

当有多条 stash,可以指定操作stash,首先使用stash list 列出所有记录:

应用第二条记录:

pop,drop 同理。

stash 代码

填写备注内容,也可以不填直接enter

在stashes菜单中可以看到保存的stash

先点击stash记录旁的小箭头,再点击 apply 或者 pop 都可恢复 stash

官方文档

git 教程

回退你已提交的 commit,并将 commit 的修改内容放回到暂存区。

一般我们在使用 reset 命令时,git reset --hard 会被提及的比较多,它能让 commit 记录强制回溯到某一个节点。而 git reset --soft 的作用正如其名,--soft (柔软的) 除了回溯节点外,还会保留节点的修改内容。

回溯节点,为什么要保留修改内容?

应用场景1:有时候手滑不小心把不该提交的内容 commit 了,这时想改回来,只能再 commit 一次,又多一条“黑 历史 ”。

应用场景2:规范些的团队,一般对于 commit 的内容要求职责明确,颗粒度要细,便于后续出现问题排查。本来属于两块不同功能的修改,一起 commit 上去,这种就属于不规范。这次恰好又手滑了,一次性 commit 上去。

学会 reset --soft 之后,你只需要:

reset --soft 相当于后悔药,给你重新改过的机会。对于上面的场景,就可以再次修改重新提交,保持干净的 commit 记录。

以上说的是还未 push 的commit。对于已经 push 的 commit,也可以使用该命令,不过再次 push 时,由于远程分支和本地分支有差异,需要强制推送 git push -f 来覆盖被 reset 的 commit。

还有一点需要注意,在 reset --soft 指定 commit 号时,会将该 commit 到最近一次 commit 的所有修改内容全部恢复,而不是只针对该 commit。

举个栗子:

commit 记录有 c、b、a。

reset 到 a。

此时的 head 到了 a,而 b、c 的修改内容都回到了暂存区。

官方文档

git cherry-pick 教程

将已经提交的 commit,复制出新的 commit 应用到分支里

commit 都提交了,为什么还要复制新的出来?

应用场景1:有时候版本的一些优化需求开发到一半,可能其中某一个开发完的需求要临时上,或者某些原因导致待开发的需求卡住了已开发完成的需求上线。这时候就需要把 commit 抽出来,单独处理。

应用场景2:有时候开发分支中的代码记录被污染了,导致开发分支合到线上分支有问题,这时就需要拉一条干净的开发分支,再从旧的开发分支中,把 commit 复制到新分支。

现在有一条feature分支,commit 记录如下:

需要把 b 复制到另一个分支,首先把 commithash 复制下来,然后切到 master 分支。

当前 master 最新的记录是 a,使用 cherry-pick 把 b 应用到当前分支。

完成后看下最新的 log,b 已经应用到 master,作为最新的 commit 了。可以看到 commithash 和之前的不一样,但是提交时间还是保留之前的。

以上是单个 commit 的复制,下面再来看看 cherry-pick 多个 commit 要如何操作。

上面的命令将 commit1 和 commit2 两个提交应用到当前分支。

上面的命令将 commit1 到 commit2 这个区间的 commit 都应用到当前分支(包含commit1、commit2),commit1 是最早的提交。

在 cherry-pick 多个commit时,可能会遇到代码冲突,这时 cherry-pick 会停下来,让用户决定如何继续操作。下面看看怎么解决这种场景。

还是 feature 分支,现在需要把 c、d、e 都复制到 master 分支上。先把起点c和终点e的 commithash 记下来。

切到 master 分支,使用区间的 cherry-pick。可以看到 c 被成功复制,当进行到 d 时,发现代码冲突,cherry-pick 中断了。这时需要解决代码冲突,重新提交到暂存区。

然后使用 cherry-pick --continue 让 cherry-pick 继续进行下去。最后 e 也被复制进来,整个流程就完成了。

以上是完整的流程,但有时候可能需要在代码冲突后,放弃或者退出流程:

回到操作前的样子,就像什么都没发生过。

不回到操作前的样子。即保留已经 cherry-pick 成功的 commit,并退出 cherry-pick 流程。

官方文档

将现有的提交还原,恢复提交的内容,并生成一条还原记录。

应用场景:有一天测试突然跟你说,你开发上线的功能有问题,需要马上撤回,否则会影响到系统使用。这时可能会想到用 reset 回退,可是你看了看分支上最新的提交还有其他同事的代码,用 reset 会把这部分代码也撤回了。由于情况紧急,又想不到好方法,还是任性的使用 reset,然后再让同事把他的代码合一遍(同事听到想打人),于是你的技术形象在同事眼里一落千丈。

学会 revert 之后,立马就可以拯救这种尴尬的情况。

现在 master 记录如下:

revert 掉自己提交的 commit。

因为 revert 会生成一条新的提交记录,这时会让你编辑提交信息,编辑完后 :wq 保存退出就好了。

再来看下最新的 log,生成了一条 revert 记录,虽然自己之前的提交记录还是会保留着,但你修改的代码内容已经被撤回了。

在 git 的 commit 记录里,还有一种类型是合并提交,想要 revert 合并提交,使用上会有些不一样。

现在的 master 分支里多了条合并提交。

使用刚刚同样的 revert 方法,会发现命令行报错了。

为什么会这样?在官方文档中有解释。

我的理解是因为合并提交是两条分支的交集节点,而 git 不知道需要撤销的哪一条分支,需要添加参数 -m 指定主线分支,保留主线分支的代码,另一条则被撤销。

-m 后面要跟一个 parent number 标识出"主线",一般使用 1 保留主分支代码。

还是上面的场景,在 master 分支 revert 合并提交后,然后切到 feature 分支修复好 bug,再合并到 master 分支时,会发现之前被 revert 的修改内容没有重新合并进来。

因为使用 revert 后, feature 分支的 commit 还是会保留在 master 分支的记录中,当你再次合并进去时,git 判断有相同的 commithash,就忽略了相关 commit 修改的内容。

这时就需要 revert 掉之前 revert 的合并提交,有点拗口,接下来看操作吧。

现在 master 的记录是这样的。

再次使用 revert,之前被 revert 的修改内容就又回来了。

官方文档

如果说 reset --soft 是后悔药,那 reflog 就是强力后悔药。它记录了所有的 commit 操作记录,便于错误操作后找回记录。

应用场景:某天你眼花,发现自己在其他人分支提交了代码还推到远程分支,这时因为分支只有你的最新提交,就想着使用 reset --hard,结果紧张不小心记错了 commithash,reset 过头,把同事的 commit 搞没了。没办法,reset --hard 是强制回退的,找不到 commithash 了,只能让同事从本地分支再推一次(同事瞬间拳头就硬了,怎么又是你)。于是,你的技术形象又一落千丈。

分支记录如上,想要 reset 到 b。

误操作 reset 过头,b 没了,最新的只剩下 a。

这时用 git reflog 查看 历史 记录,把错误提交的那次 commithash 记下。

再次 reset 回去,就会发现 b 回来了。

对我这种喜欢敲命令而不用图形化工具的爱好者来说,设置短命令可以很好的提高效率。下面介绍两种设置短命令的方式。

方式一

方式二

打开全局配置文件

写入内容

使用

本文主要分享了5个在开发中实用的 git 命令和设置短命令的方式。

文中列举的应用场景有部分不太恰当,只是想便于同学们理解,最重要的是要理解命令的作用是什么,活学活用才能发挥最大功效。

如果你也有一些实用的 git 命令也欢迎在评论区分享~