如何使用git.oschina.net

0 准备工作

- 在官网下载git安装包

我们在Windows下安装之后,开始菜单会出现Git Bash和Git GUI,这里我们只用Bash命令行。

161637_gZXq_576429.png

因为相比与GUI,使用Git Bash命令行模式的流程和在Linux下使用git的流程完全一致!完全一致!完全一致!如果你了解Linux基本命令,那么在Git Bash你基本不需要学习新东西;如果你不了解,那么Git Bash会为你打开命令行的大门。

而且git命令行附带提供一些有用的小工具(包括全部Linux目录操作命令、ssh远程连接工具,grep工具等等),我们可以认为这是一个迷你版的Shell

162621_xdj7_576429.png

- 官方帮助

- 除了官方帮助,如果您想系统的学习git工具用法,墙裂推荐廖雪峰老师教程

www.liaoxuefeng.com

而本文主要介绍常用的几处,工具嘛,就应该现学现用。

最火的git托管平台无疑是github,但github访问速度有时比较慢,而且github私有仓库需要付费。所以这里我们使用开源中国的git托管平台。

github的其他替代品包括:https://coding.net 和 https://bitbucket.org

1 初始化

- 在http://git.oschina.net注册帐号新建项目xxx

刚建立的时候不要点选“用readme文件初始化该项目”,那么新项目为空,所以首页会提示与自己项目和邮箱名称对应的简易教程:

根据自己的情况,复制每行命令,粘贴到git命令行中运行即可。

- 1 Git 全局设置;//设置自己的用户名和邮箱;如果以前设置过的就不需要再

- 2 创建git仓库;//你要从0开始创建,照着做即可。其中cd/touch/mkdir之类都是通用的Linux命令

- 3 已有项目?//你已经搞好一个本地git仓库了,想关联本地和远程

163922_wzvP_576429.png

操作完之后,你刷新该项目网址,就可以看到自己的改动了。

git遵循一切皆文件的哲学,在Linux下,通过git config --global 设置全局user.name和user.email之后,这些信息存储在本地文件中。
 

von@FENG MINGW32 /e/temp/xxx (master)
$ git config --global user.name "username"
von@FENG MINGW32 /e/temp/xxx (master)
$ git config --global user.email "username@domain.com"
von@FENG MINGW32 /e/temp/xxx (master)
$ cat ~/.gitconfig
[user]
    email = username@domain.com
    name = username

同样的,假如不想设置全局user.name和user.email,只想要对当前项目有效,那么只需要在命令中去掉--global参数即可。

von@FENG MINGW32 /e/temp/xxx (master)
$ git config user.name "username"
von@FENG MINGW32 /e/temp/xxx (master)
$ git config user.email "username@domain.com"
von@FENG MINGW32 /e/temp/xxx (master)
$ tail .git/config -n 3
[user]
    email = username@domain.com
    name = username

 

2 仓库地址有两种: HTTPS地址和SSH地址

对于xxx这个项目

其HTTPS地址:https://git.oschina.net/snifferapache/xxx.git

其SSH地址:git@git.oschina.net:snifferapache/xxx.git

如果在写https地址,那么以后将本地代码push到远端的时候需要用户名密码,比较麻烦;

所以本机选择ssh地址,这样的话首先需要配置SSH Key

2.1 使用HTTPS地址

添加origin的https地址之后,push的时候出现如下错误:

fatal: unable to access 'https://git.oschina.net/xxx.git/': Protocol https not supported or disabled in libcurl

按照(http://www.oschina.net/question/1424919_148309

142358_JhId_213622.png

本机为window7 32位操作系统,在(C:\Windows\System32)下找到libcurl.dll,删除之后再次push的时候出现以下问题:

$ git push origin master

remote: Not Found

fatal: repository 'https://git.oschina.net/snifferpache/xxx.git/'  not found

鉴于问题诡异,读者直接使用ssh地址得了。

2.2 使用SSH地址

SSH key 可以让你在你的电脑和 Git @ OSC 之间建立安全的加密连接。

在(官方帮助)中,按照“SSH Keys”这一栏操作:

在git命令行中按如下命令来生成sshkey:

ssh-keygen -t rsa -C "xxxxx@xxxxx.com"# Creates a new ssh key using the provided email
# Generating public/private rsa key pair...

一路回车,默认会在用户目录下生成.ssh文件夹(我的是C:\Users\von\.ssh)

将id_rsa.pub用notepad++/editplus等编辑器打开,将其内容复制到http://git.oschina.net/keys建立的新key即可。

然后用ssh命令来测试是否验证通过。

成功效果如下:

Administrator@FENG /f/xxx(master)
$ ssh -T git@git.oschina.net
Welcome to Git@OSC, 你的用户名!

如果直接复制shell里面显示的id_rsa.pub内容,则会出现以下错误

添加git@osc公钥提示“Fingerprint 已经被使用 Fingerprint 生成失败!”

3 本地操作

版本控制的奥义在于跟踪你的修改记录。

3.1 添加新文件

新增一个文件,新文件自然没被跟踪,git status查看当前repository状态会提示untracked file

165857_09Wy_576429.png

git status作用是查看当前状态,多打这个命令,没事打着玩儿~

把新文件添加到跟踪体系:

170226_OKiv_576429.png

命令格式为: git add <filename>

其中filename可以用星号*,或者--all取代

提交这个文件:

170355_X1ov_576429.png

命令格式为: git commit -m '备注信息'

 

3.1.1 解决中文名文件转义问题

Jason@FSJ-PC MINGW32 /d/osc/test (master)
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   "\344\275\240\345\245\275.txt"


Jason@FSJ-PC MINGW32 /d/osc/test (master)
$ git config --global core.quotepath false

Jason@FSJ-PC MINGW32 /d/osc/test (master)
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   你好.txt

 

3.2 文件被修改

现在我们修改这个文件,并看看新旧文件有啥区别

170734_T4jU_576429.png

命令格式为:git diff <filename>

查看被modify的文件哪里变动了,我们可以看到hello文件多了一行(绿色加号开头)

接下来我们保存、提交这个变动:

171049_0zkP_576429.png

可以看到,任何时候,只有当我们commit之后没有新的修改,我们的working directory才是clean的

总结本地操作基本流程:

修改->add->commit;

add、commit两步并做一步只要在使用$git commit时加一个-a选项即可。

4 push本地仓库到远端

添加远端地址:git add remote [remote-name] [remote-address]

von@FENG MINGW32 /e/temp/xxx (master)
git add remote origin git@git.oschina.net:snifferapache/xxx.git

其中remote-name可以随便起,这样可以将一个本地仓库关联多个远端仓库

 

接着git push命令会将本地仓库上传到远端,格式为git push [remote-name] [branch-name]:

von@FENG MINGW32 /e/temp/xxx (master)
$ git push -u origin master
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 625 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To git@git.oschina.net:snifferapache/xxx.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

由于远程库是空的,我们第一次推送master分支时,加上了-u参数(设置该分支为upstream),Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令

这样整个推送流程遍完成了。我们打开该项目在开源中国的托管网址便可以看到最新的提交记录。

 

4.1 如何把项目push到多个remote-address呢?

如果前面设置了多个远端比如:origin1, origin2...,有多个branch比如:master, dev1, dev2...

那么push的时候选择指定的[remote-name]和[branch-name]即可,比如:

$ git push origin1 dev1
...
$ git push origin2 master
...

4.2 多个SSH-Key如何共存?

我们可以在<.ssh>/config文件中指定每个网站各自验证的private key即可。

$ cat ~/.ssh/config 
Host git.oschina.net
  #指定private key路径
  IdentityFile ~/.ssh/osc_rsa
  User myname1
Host github.com
  IdentityFile ~/.ssh/github_rsa
  User myname2

测试是否成功

$ ssh -T git@git.oschina.net
Welcome to Git@OSC, myname1!
$ ssh -T git@github.com
Hi myname2! You've successfully authenticated, but GitHub does not provide shell access.

可以看到oschina和github的ssh验证都通过了。

ref:

http://stackoverflow.com/questions/2419566/best-way-to-use-multiple-ssh-private-keys-on-one-client

http://stackoverflow.com/questions/3225862/multiple-github-accounts-ssh-config

 

5 操作备忘(每句命令都不需要分号)

 

以下都是补充和个人备忘

* 创建版本库并初始化:mkdir repositoryname;git init;

* 本地或远端的克隆版本:git clone /path/to/repository;git clone username@host:/path/to/your/repository;

* 添加、提交和推送更改:git add filename;git commit -m "add filename";git push origin master【master为默认分支】;

* 掌握工作区的状态、查看readme.txt的具体变动:git status;git diff readme.txt;

* 查看历史记录、回退到上个版本:git log或者git log --pretty=oneline;git reset --hard HEAD^或者git reset --hard 版本commit id前几位;

* 查看readme.txt内容、查看每一次变动命令:cat readme.txt;git reflog;

* 查看readme.txt的更改情况、丢弃工作区的修改:git diff HEAD -- readme.txt;git checkout -- file;

* 查看分支合并图:git log --graph;

* 禁用fast forword的合并:git merge --no-ff -m "merge with no-ff" dev;

* 显示所有分支:git branch

* 切换分支: git checkout <branch>

* 新建并切换到分支dev:git checkout -b dev;

* 删除分支、强删分支:git branch -d name;git branch -D name;

* 创建远程origin的分支dev到本地:git checkout -b dev origin/dev

指定本地dev分支与远程origin/dev分支的链接:git branch --set-upstream dev origin/dev

* 合并指定分支到当前分支

比如,如果要将开发中的分支(dev),合并到稳定分支(master),

首先切换的master分支:git checkout master。

 然后执行合并操作:git merge dev

 如果有冲突,会提示你,调用git status查看冲突文件。

$ cat readme.txt
<<<<<<< HEAD
test in master
=======
test in dev
>>>>>>> dev

 解决冲突:
<<<<<<<标记冲突开始,后面跟的是当前分支中的内容。HEAD指向当前分支末梢的提交。=======之后,>>>>>>>之前是要merge过来的另一条分支上的代码 。>>>>>>>之后的dev是该分支的名字。 对于简单的合并,手工编辑,然后去掉这些标记

 然后调用git add或git rm将解决后的文件暂存。

 所有冲突解决后,git commit 提交更改。

* 储存当前工作现场、恢复、恢复指定stash:git stash;git stash apply或者git stash pop;git stash apply stash@{0};

* 连接到远程库:git remote add origin <repository-address>

* 添加远程库地址:git remote add <shortname> <url>

* 移除地址:git remote remove <shortname>

* 查看详情:git remote show remote_name

* 查看远程库信息:git remote [-v]

* 借助lantern在terminal连通github

export http_proxy='127.0.0.1:8787'
export https_proxy='127.0.0.1:8787'

* 打一个标签(给某版本打标签)、查看所有标签、指定标签信息:git tag tagname【git tag v0.9 6224937】;git tag;-a tagname -m "blablabla..."

* 删除标签、推送标签v1.0到远端(所有标签):git tag -d v0.1;git push origin v1.0【git push origin --tags】;

* 删除远端标签: git push origin :refs/tags/v0.9;

* 撤回到指定标签:

step1. 查看tagname的commit id:git show tagname

step2. 撤回到该commit id

* 在github上:先fork别人项目到自己仓库再clone到本地;

* 让git显示颜色:git config --global color.ui true;

忽略某些文件时,需要编写.gitignore,.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理

* 配置别名举例:git config --global alias.st status;

* ubuntu下升级git版本

sudo apt-add-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git

* 从git中永久删除文件以节省空间

# 删除 images文件夹
$ rm -rf images
$ git add --all
$ git commit -m 'del image'

# 找到rewrite的commit id为0a43
$ git filter-branch --tree-filter 'rm -rf images' HEAD
Rewrite 0a43cad9b97702db901a324c3d8fbc75427528f3 (13/13)
Ref 'refs/heads/master' was rewritten

# 找到0a43对应的refs并删除之
$ git ls-remote .
f640ae907be9266f5712ed0607b7b1f97533735e	HEAD
f640ae907be9266f5712ed0607b7b1f97533735e	refs/heads/master
0a43cad9b97702db901a324c3d8fbc75427528f3	refs/original/refs/heads/master
51ee93e386c919ecd6d4d2dd8f39a9086de96c6d	refs/remotes/coding/master
51ee93e386c919ecd6d4d2dd8f39a9086de96c6d	refs/remotes/origin/master
$ git update-ref -d refs/original/refs/heads/master

$ git ls-remote .
f640ae907be9266f5712ed0607b7b1f97533735e	HEAD
f640ae907be9266f5712ed0607b7b1f97533735e	refs/heads/master
51ee93e386c919ecd6d4d2dd8f39a9086de96c6d	refs/remotes/coding/master
51ee93e386c919ecd6d4d2dd8f39a9086de96c6d	refs/remotes/origin/master

# Prune all unreachable objects from the object database。从对象数据库清除不可达对象
$ git prune  
# Cleanup unnecessary files and optimize the local repository。清除非必须的文件,优化本地repository
$ git gc
# forced update。强制更新
$ git push origin master -f

git 回退到某版本后,想再前进

git本地有修改如何强制更新,覆盖本地

撤回修改

对于新增的文件:直接删除

对于修改的文件:git checkout -- <filename>或者 git checkout .

git fetch --all

git reset --hard origin/master

git fetch 只是下载远程的库的内容,不做任何的合并git reset 把HEAD指向刚刚下载的最新的版本

 

* git 在提交之前撤销add操作

git rm -r --cached .

* git 撤销上次commit

git根据–soft –mixed –hard,会对working tree和index和HEAD进行重置:

mixed:此为默认方式,不带任何参数的git reset,采用这种方式,它回退到某个版本,只保留源码,回退commit和index信息
soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可.
hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容.

撤回到指定commit id,不保存修改: git reset --[soft|hard|mixed] <commit-id>

$ git log --pretty=oneline
e7fa54bc7fde7a74c42d4bc83b20ae248a2bb6e7 running-gem5-gpu-output
0ce762e14c560ffe7a2e5107e8cabad3abe5bd15 clone gem5-gpu
...
$ git reset 0ce7
...

* git如何回滚远程仓库

比如现在有两次commit都push到远程仓库了,那么可以在本地reset到上次commit,然后强制push即可。

$ git log --oneline
commitid2 msg2
commitid1 msg1

注意本地和远程要在同一分支。否则没有效果
$ git reset --hard commitid1

$ git push [your-origin] [your-remote-branch] -f

 

6 Git Cheat Sheet:

01202451_6QOr.png

 

闯过这 54 关,点亮你的 Git 技能树

关卡

#1: init
#2: config
#3: add
#4: commit
#5: clone
#6: clone_to_folder
#7: ignore
#8: include
#9: status
#10: number_of_files_committed
#11: rm
#12: rm_cached
#13: stash
#14: rename
#15: restructure
#16: log
#17: tag
#18: push_tags
#19: commit_amend
#20: commit_in_future
#21: reset
#22: reset_soft
#23: checkout_file
#24: remote
#25: remote_url
#26: pull
#27: remote_add
#28: push
#29: diff
#30: blame
#31: branch
#32: checkout
#33: checkout_tag
#34: checkout_tag_over_branch
#35: branch_at
#36: delete_branch
#37: push_branch
#38: merge
#39: fetch
#40: rebase
#41: repack
#42: cherry-pick
#43: grep
#44: rename_commit
#45: squash
#46: merge_squash
#47: reorder
#48: bisect
#49: stage_lines
#50: find_old_branch
#51: revert
#52: restore
#53: conflict
#54: submodule
#55: contribute

 

7.54 submodule

 

http://stackoverflow.com/questions/14448601/what-does-this-green-icon-mean-in-a-github-repository

```sh

git submodule add <url> <directory>

git submodule update --init 

```

http://stackoverflow.com/questions/19584255/what-does-a-grey-icon-in-remote-github-mean

添加submodule后删除.gitmodules文件,该submodule文件夹会变成灰色

 

8 ref

1. git checkout 命令详解

 

转载于:https://my.oschina.net/SnifferApache/blog/308863

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值