ちょっと今更な感じもありますが、iOS開発でGitを使うときのTipsを紹介します。
Gitそのものの使い方は理解している前提のもとで書きます。

バージョン管理する対象

Xcodeのプロジェクトにはバージョン管理する上で結構余計なものが入っています。

Gitで管理すべきでないもの

  • Xcodeの作業データ
    Xcodeのプロジェクトは.xcodeprojですが、こいつ自身はディレクトリになっていて

    • project.pbxproj
    • project.xcworkspace
    • xcuserdata

というファイルが入っています。このうち、Gitで管理するべきものはproject.pbxprojです。
その他のものはXcodeの状態(グループを開いてるかなど)を管理しているものなので、
プロジェクトのバージョン管理対象としては適切ではありません。

  • ビルドデータ
    xcodebuildコマンドを実行すると、プロジェクト直下にbuildディレクトリが作成されます。
    これはGitで管理すべきものが揃っていれば生成できるので、Git管理下に置く必要はありません。

設定例

プロジェクト直下に以下のような.gitignoreを置きます。

project.xcworkspace/
xcuserdata/
build/

自分の場合、ところどころvimを使ったりするので以下も追加しています。

*~
*.swp

それと、Macの.gitignoreの定番も追加しています。

*.DS_Store

自動マージ

.xibはXMLで書かれていて、Gitはこれらファイルを自動マージするべきものと判断します。
.xibがコンフリクトして手動マージすると、ファイルを開けなくなってしまうことがあります。

以前のコミットにチェックアウトすればもとに戻すことはできますが、
あらかじめ自動マージしないように設定することもできます。

自動マージしてほしくないもの

  • .xibなどのUI設定ファイル
  • project.pbxproj

設定例

プロジェクト直下に以下のような.gitattributesを置きます。

*.pbxproj -crlf -diff -merge
*.xib -crlf -diff -merge

このようにすると、自動マージは回避されコンフリクト時にはHEADの状態が保持されます。
以下のコマンドで、マージするコミットの状態に変更することもできます。

git checkout --theirs -- project.pbxproj

逆に、HEADの状態に戻すには以下のコマンドを実行します。

git checkout --ours -- project.pbxproj

この設定ではマージ先の変更に気づきにくかったりするので、注意が必要です。
もっといい方法があれば知りたいです。

参考: Gitのカスタマイズ - Gitの属性

モジュール管理

GitHubなどには便利なモジュールがあり、プロジェクトに導入することもあると思います。
git submoduleを使うとモジュールの管理を行うことができます。

以下の説明では、モジュールはLibraries/以下に配置するものとします。

モジュールの導入

以下のコマンドを実行するとモジュールのファイルがダウンロードされます。

git submodule add git@github.com:ishkawa/ISNetwork.git Libraries/ISNetwork

不要なファイル(READMEとか)がある場合は、Xcodeから参照を外します。
ファイル自体を削除するとサブモジュールのバージョン管理に影響を与えるので、
Xcode上の参照のみを削除することをおすすめします。 

モジュールの更新

モジュールのディレクトリに移動してGitの操作をするだけです。

cd Libraries/ISNetwork
git pull

一括で最新のコミットをプルするには以下のコマンドを実行します。

git submodule foreach git pull

モジュールの削除

.git/config, .gitmodulesから該当する箇所を削除します。

.git/config

[submodule "ISNetwork"]
    url = git@github.com:ishkawa/ISNetwork.git

.gitmodules

[submodule "ISNetwork"]
    path = ISNetwork
    url = git@github.com:ishkawa/ISNetwork.git

ファイル自体も削除し、Gitの管理下から外します。

rm -R Libraries/ISNetwork
git rm --cached Libraries/ISNetwork

参考: How do I remove a git submodule?

モジュールの一括ダウンロード

プロジェクトをクローンしたとき、依存しているモジュールのダウンロードはされません。
依存しているモジュールをすべてダウンロードするには以下のコマンドを実行します。

git submodule update --init --recursive

##

他にもこういう設定したら捗るよってものがあれば、ぜひ教えて下さい。